'Volley not calling getParams() for standard POST request

I am trying to post some parameters to my rails API using Volley in Android. This is the code:

I tried with two log statements, one in getParams() and another in getHeaders(). The one in getHeaders() is logged while the other one is not. Why is volley ignoring 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);

}


Solution 1:[1]

Using StringRequest in place of 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);

Solution 2:[2]

The third parameter should be a JSONObject you do not need the getParams() method just pass them into the request.

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

Solution 3:[3]

it happened because Volley params cache.

clean it like this

requestQueue.getCache().clear();

hope it's useful!?

Solution 4:[4]

I solved my issue by simply removing Content-Type from header :)

Solution 5:[5]

Please override the getBody() method, and if your server can not handle JSON request parameter, you have to override the getHeaders() method to change your Content-Type.

Issue can found here: https://github.com/mcxiaoke/android-volley/issues/82

Solution 6:[6]

For JSONobjectRequest the getParams() doesn’t work for POST requests so you have to make a customRequest and override getParams() method over there. Its because JsonObjectRequest is extended JsonRequest which overrides getBody() method directly, so your getParam() would never invoke. To invoke your getParams() method you first have to override getBody(). Or for a simple solution you can use StringRequest.

Solution 7:[7]

Try using shouldCache(false) for your request object before you add it into queue.

Solution 8:[8]

To provide POST parameter build a JSONObject with your POST parameters and pass that JSONObject as a 3rd parameter. JsonObjectRequest constructor accepts a JSONObject in constructor which is used in Request Body.

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);

Solution 9:[9]

I had the same problem I solved it using clear queue Cache

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

Solution 10:[10]

just use requestQue.getCache().clear();

Solution 11:[11]

If you do a Post using Android Volley, it should call the methods getHeaders(), getBody(), getParams(), and getBodyContentType() in that order.

If you do a GET request using Android Volley, it should call the methods getHeaders() only.

Solution 12:[12]

if you use My Singleton try this:

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

Maybe you use cache on your code