okhttp post请求向服务器发送空值

时间:2016-12-19 15:54:32

标签: php android okhttp3

我正在开发简单的Android应用程序,向服务器发出简单的发布请求。但它为服务器上的请求体所需的两个密钥发送空值。我已经从我的应用端检查了它,但它没有发送空值。

这是我的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));
?>

这是我的Android应用程序中的代码。

@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 个答案:

答案 0 :(得分: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());
            }

        }
    }