Подтвердить что ты не робот

Волейбол не вызывает getParams() для стандартного запроса POST

Я пытаюсь опубликовать некоторые параметры в моем rails API, используя Volley в Android. Это код:

Я попробовал с двумя операторами журнала, один в getParams() и другой в getHeaders(). Один в getHeaders() регистрируется, а другой - нет. Почему волейбол игнорирует getParams()?

{
//full_name,email,password are private variables defined for this class

String url =  "http://10.0.2.2:3000/users/sign_up.json" ; 

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                 url, null,
                 new Response.Listener<JSONObject>() {

                     @Override
                     public void onResponse(JSONObject response) {
                         Log.d(TAG, response.toString());
                         pDialog.hide();
                     }
                 }, new Response.ErrorListener() {

                     @Override
                     public void onErrorResponse(VolleyError error) {
                         VolleyLog.d(TAG, "Error: " + error.getMessage());
                         pDialog.hide();
                     }
                 }) {

             @Override
             public Map<String, String> getParams() {
                 Map<String, String> params = new HashMap<String, String>();

                 //This does not appear in the log
                 Log.d(TAG,"Does it assign params?") ;


                 params.put("name", full_name.getText().toString());
                 params.put("email",email.getText().toString());
                 params.put("password", password.getText().toString());

                 return params;
             }
             @Override
             public Map<String, String> getHeaders() throws AuthFailureError {

                 //This appears in the log  
                 Log.d(TAG,"Does it assign headers?") ;

                 HashMap<String, String> headers = new HashMap<String, String>();
                 headers.put("Content-Type", "application/json; charset=utf-8");

                 return headers;
             }

         };

        // Adding request to request queue
        VHelper.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

}
4b9b3361

Ответ 1

Использование StringRequest вместо JsonObjectRequest

StringRequest sr = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, response.toString());
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Log.d(TAG, ""+error.getMessage()+","+error.toString());
        }
    }){
        @Override
        protected Map<String,String> getParams(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("id", "28");
            params.put("value", "1");

            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String,String> headers = new HashMap<String, String>();
            headers.put("Content-Type","application/x-www-form-urlencoded");
            headers.put("abc", "value");
            return headers;
        }
    };

        AppController.getInstance().addToRequestQueue(sr);

Ответ 2

Третий параметр должен быть JSONObject, который вам не нужен, метод getParams() просто передает их в запрос.

 JsonObjectRequest jsonObjReq = new JsonObjectRequest(
            method,
            url,
            jsonObjParams,    // <<< HERE
            responseListener,
            errorListener);

Ответ 3

это произошло из-за того, что волейбол выполняет настройку кеша.

очистите его так:

requestQueue.getCache().clear();

надеюсь, что это полезно! 😃

Ответ 4

Пожалуйста, переопределите метод getBody(), и если ваш сервер не может обрабатывать параметр запроса JSON, вам необходимо переопределить метод getHeaders(), чтобы изменить свой Content-Type.

Проблема может быть найдена здесь: https://github.com/mcxiaoke/android-volley/issues/82

Ответ 5

Для JSONobjectRequest функция getParams() не работает для запросов POST, поэтому вы должны сделать customRequest и переопределить метод getParams(). Это связано с тем, что JsonObjectRequest расширен JsonRequest, который напрямую переопределяет метод getBody(), поэтому ваш getParam() никогда не будет ссылаться. Чтобы вызвать метод getParams(), вам сначала нужно переопределить getBody(). Или для простого решения вы можете использовать StringRequest.

Ответ 6

Я решил свою проблему, просто удалив Content-Type из заголовка :)

Ответ 7

Попробуйте использовать shouldCache(false) для объекта запроса, прежде чем добавить его в очередь.

Ответ 8

Чтобы предоставить параметр POST создайте JSONObject с вашими параметрами POST и передайте этот JSONObject в качестве третьего параметра. JsonObjectRequest принимает JSONObject в конструкторе, который используется в теле запроса.

JSONObject paramJson = new JSONObject();

paramJson.put("key1", "value1");
paramJson.put("key2", "value2");


JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
requestQueue.add(jsonObjectRequest);

Ответ 9

У меня была та же проблема, я решил ее, используя очистить кэш очереди

RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.getCache().clear();
requestQueue.add(stringRequest);

Ответ 10

если вы используете My Singleton, попробуйте это:

MyVolley.getInstance(this).getRequestQueue().getCache().clear();

Может быть, вы используете кеш в вашем коде