2016-12-19 9 views
2

私は簡単なアンドロイドアプリケーションを開発しています。しかし、サーバーからの要求本体として必要な両方のキーにヌル値を送信します。私は私のアプリの終わりからそれをチェックしましたが、それはヌル値を送信していません。okhttp投稿のリクエストサーバーにnull値を送信する

ここに私のPHPコードです。

<?php 
include 'DBConnection.php'; 

$db = DBConnection::getInstance(); 
$db = DBConnection::getInstance(); 
$mysqli = $db->getConnection(); 

$username = $_POST ['username']; 
$password = $_POST ['password']; 

$result_array = array (
    "username " => $username, 
    "password " => $password 
); 

echo (json_encode($result_array)); 
?> 

ここに私のアンドロイドアプリケーションのコードがあります。

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       new LoginPostRequest().execute(RestConnection.LOGIN_POST); 
      } 
     }); 
    } 

private class LoginPostRequest extends AsyncTask<String, Object, String> { 

     private RequestBody body; 

     @Override 
     protected void onPreExecute() { 
      String userNameData = userName.getText().toString().replace(" ",""); 
      String PasswordData = password.getText().toString().replace(" ",""); 
      JSONObject requestBody = new JSONObject(); 

      try { 
       requestBody.put("username", userNameData); 
       requestBody.put("password", PasswordData); 
      } catch (JSONException e) { 
       Log.d(TAG,"Login onPreExecute"+e.getLocalizedMessage()); 
      } 

      String string = requestBody.toString(); 
      body = RequestBody.create(JSON, string); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      String urlEndPoint = params[0]; 

      Request request = new Request.Builder() 
        .url(RestConnection.API_BASE+urlEndPoint) 
        .post(body) 
        .build(); 

      try { 
       Response response = client.newCall(request).execute(); 
       return response.body().string(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return "String"; 

     } 

     @Override 
     protected void onPostExecute(String response) { 
      JSONObject responseBody; 
      try { 
       responseBody = new JSONObject(response); 
       String message = responseBody.getString("message"); 

       if(!message.equals("login failed")){ 
        Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show(); 
        Intent i = new Intent(MainActivity.this,MainMenuActivity.class); 
        startActivity(i); 
        finish(); 
       }else{ 
        Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       Log.d(TAG,"Login onPostExecute :"+e.getLocalizedMessage()); 
      } 

     } 
    } 

私はokhttpバージョンv3.5.0を使用しています。私は間違って何をしていますか?

+1

は、REST APIとやり取りするときに 'Retrofit' /' gson'を使用することをおすすめします。 –

+0

これを参照してくださいhttp://stackoverflow.com/questions/32856401/using-okhttp-library-for-posting-to-a-php-script-that-saves-to-mysqlそれは完全な例を持っています.. – rafsanahmad007

+0

@ rafsanahmad007それはokhttpの古いバージョンです。私が探している答えではありません。私のコードのエラーを指摘しておきます。 –

答えて

0

回答はhereから見つかりました。 FormBody.Builderを使用する必要があります。何らかの理由で、それはokhttpサイトで言うように動作しません。 (私の質問で試した方法)。

ここに私の編集したAsyncTaskクラスがあります。

private class LoginPostRequest extends AsyncTask<String, Object, String> { 

     private RequestBody body; 
     private HashMap<String,String> postData; 

     @Override 
     protected void onPreExecute() { 
      String userNameData = userName.getText().toString().replace(" ",""); 
      String PasswordData = password.getText().toString().replace(" ",""); 

      postData = new HashMap<>(); 
      postData.put("username",userNameData); 
      postData.put("password",PasswordData); 

      FormBody.Builder builder = new FormBody.Builder(); 

      for (Map.Entry<String, String> entry : postData.entrySet()) { 
       builder.add(entry.getKey(), entry.getValue()); 
      } 

      body = builder.build(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      String urlEndPoint = params[0]; 

      Request request = new Request.Builder() 
        .url(RestConnection.API_BASE+urlEndPoint) 
        .post(body) 
        .build(); 
      try { 
       Response response = client.newCall(request).execute(); 
       return response.body().string(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String response) { 

      JSONObject responseBody; 
      try { 
       responseBody = new JSONObject(response); 
       String message = responseBody.getString("message"); 

       if(!message.equals("login failed")){ 
        Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show(); 
        Intent i = new Intent(MainActivity.this,MainMenuActivity.class); 
        startActivity(i); 
        finish(); 
       }else{ 
        Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       Log.d(TAG,"Login onPostExecute :"+e.getLocalizedMessage()); 
      } 

     } 
    } 
関連する問題