почему запрос Volley String не может отправить параметры тела с методом POST в x-www-form-urlencoded? - PullRequest
0 голосов
/ 26 апреля 2019

Прежде всего, я должен сказать, что я прочитал несколько подобных историй здесь, но ни одна из них не решила мою проблему получения кода ошибки 400. Я хочу отправить некоторую информацию для входа на сервер в Android Studio 3.3.1 и библиотеку залпов, используя метод Post. Я посылаю params в качестве значения ключа в getBody и устанавливаю тип содержимого в getBodyContentType (). Сервер получает параметры только в формате xxx-form-urlencoded. Я использую Почтальон в качестве прокси, чтобы увидеть, что отправляет ... параметры принимаются почтальоном в теле в необработанном формате, а не в формате xxx-form-urlencoded, и я думаю, что именно поэтому сервер не может получить параметры входа в систему, и я получаю код ошибки 400 (BasicNetwork.performRequest: неожиданный код ответа 400) - Кстати, сервер написан на asp.net и веб-сервере IIS.

 private  void PostParams()
        {
             Boolean is_valid_user;
            try {

                String URL = "http://192.168.43.22:5555/AOBServices/login";
                JSONObject jsonBody = new JSONObject();
                jsonBody.put("my_very_special_key","Love");
                jsonBody.put("username", "amir");
                jsonBody.put("password", "1234");
                jsonBody.put("grant_type", "password");
                final String requestBody = jsonBody.toString();
                final StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        Log.i("VOLLEY", response);
                        Toast.makeText(LoginActivity.this, "SUCCESSSSSSSSSSSSS \n response: "+response, Toast.LENGTH_SHORT).show();
                        //update shared prefs.....
                        myResponse=response;
                        shprefs= new sharedPrefsClass(getApplicationContext());
                        shprefs.setDefaults("USER_ID", mEmail);
                        shprefs.setDefaults("IS_SIGNEDIN", true);
                        startActivity(new Intent(LoginActivity.this,MainActivity.class));
                        finish();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        // As of f605da3 the following should work
                        NetworkResponse response = error.networkResponse;
                        if (error instanceof ServerError && response != null) {
                            try {
                                String res = new String(response.data,
                                        HttpHeaderParser.parseCharset(response.headers, "utf-8"));

                            } catch (UnsupportedEncodingException e1) {
                                // Couldn't properly decode data to string
                                e1.printStackTrace();
                            }

                        }
                    }


                }) {
                    @Override
                    public String getBodyContentType() {
                        return "application/x-www-form-urlencoded; charset=UTF-8";

                    }
                    @Override
                    protected String getParamsEncoding() {
                        return "utf-8";
                    }


                    @Override
                    public byte[] getBody() throws AuthFailureError {
                        try {
                                 return requestBody == null ? null : requestBody.getBytes("utf-8");

                        } catch (UnsupportedEncodingException uee) {
                            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                                 return null;
                        }
                    }

                 @Override
                    protected Response<String> parseNetworkResponse(NetworkResponse response) {
                        String responseString = "";
                        if (response != null) {
                            responseString = String.valueOf(response.statusCode);
                            // can get more details such as response.headers
                        }
                        return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response));
                    }
                };

                requestQueue.add(stringRequest);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

1 Ответ

0 голосов
/ 27 апреля 2019

для тех, кто сталкивается с подобной проблемой: разочаровавшись в волейболе, я реализовал сетевые вещи HttpUrlConnection и выяснил, в чем проблема: Я отправлял параметры в формате объекта json, т.е. {key: value, ...}, в то время как сервер ожидал ключ: значение & ключ: значение & ... поэтому вернулся к Volley и сделал строку параметров, как указано выше, и использовал ее в getBody(), решил мою проблему. :)

...