Запрос Volley Post не работает с API

Я использовал Volley для POST имени, пароля и электронной почты пользователя для регистрации. Я взял ссылку из этого руководства. И работал так же, как определено в этом уроке.

Вот мой код:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
                            URL_string.api_url,null
                            new Response.Listener<JSONObject>() {
                                @Override
                                public void onResponse(JSONObject response) {
                                    Log.i("Result", "Success");
                                }
                            }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.i("Result", "UnSuccess");
                        }
                    }){

                        @Override
                        protected Map<String, String> getParams() throws AuthFailureError {
                            Map<String, String> params = new HashMap<String, String>();
                            Log.i("Result_Params",emailValue + passwordValue + nameValue);
                            params.put("email", emailValue);
                            params.put("password", passwordValue);
                            params.put("name", nameValue);
                            return super.getParams();
                        }

                        @Override
                        public Map<String, String> getHeaders() throws AuthFailureError {
                            HashMap<String, String> headers = new HashMap<String, String>();
                            headers.put("Content-Type", "application/json; charset=utf-8");
                            return super.getHeaders();
                        }

                    };

                    RequestQueue requestQueue = Volley.newRequestQueue(this);
                    jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                    requestQueue.add(jsonObjectRequest);

Но мой код показывает эту ошибку:

[368] BasicNetwork.performRequest: Unexpected response code 422 for http://myapi.com/api/register

Ошибка 422 определяется в API как:

    {
       "message": "422 Unprocessable Entity",
       "errors": {
         "email": [
           "The email field is required."
         ],
         "password": [
           "The password field is required."
         ],
         "name": [
           "The password field is required."
         ]
       },
       "status_code": 422
}

Я попытался:

  1. изменение JsonObjectRequest на StringRequest,

  2. исходный URL вместо URL_string.api_url,

Но ответ все тот же. Это из-за того, что я не сделал ни одного класса для библиотеки Volley? Я сделал это тоже с Androidhive.info , но не удалось!

Я не знаю, как перейти к этому шагу сейчас, пока вход в систему getParams регистрирует правильное значение имени, электронной почты и пароля, введенных пользователем, но операция POST все еще не работает. Пожалуйста помоги! Заранее спасибо!


person Swr7der    schedule 01.07.2016    source источник
comment
Вы должны вернуть параметры, а не супер значения   -  person silverFoxA    schedule 01.07.2016
comment
Да, это сработало. Большое спасибо @silverFoxA   -  person Swr7der    schedule 01.07.2016


Ответы (1)


Вам нужно вернуть созданный вами объект params, а не родительский метод (который пуст).

@Override
protected Map<String, String> getParams() throws AuthFailureError {
    Map<String, String> params = new HashMap<String, String>();
    Log.i("Result_Params",emailValue + passwordValue + nameValue);
    params.put("email", emailValue);
    params.put("password", passwordValue);
    params.put("name", nameValue);
    return params; //not super.getParams();
}

Как указал паблобу, это также относится к вашему getHeaders():

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    HashMap<String, String> headers = new HashMap<String, String>();
    headers.put("Content-Type", "application/json; charset=utf-8");
    return headers; //not super.getHeaders();
}
person Dave Chen    schedule 01.07.2016
comment
такое же изменение требуется при возврате getHeaders() - person pablobu; 01.07.2016
comment
Спас мой день... большое спасибо :) DaveChen и @pablobu - person Swr7der; 01.07.2016