Volley not calling getParams() for standard POST request
Asked Answered
C

12

19

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

}
Casuistry answered 18/6, 2014 at 11:43 Comment(1)
It's quite easy to solve, check my answer here.Serna
I
31

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);
Izmir answered 23/11, 2014 at 16:10 Comment(5)
I can't believe this was it. I was using a JSONObjectRequest and the debugger never hit the getParams() method, so no POST params. The moment i changed to StringRequest the debugger hit the getParams(). ¬_¬Corruption
Thanks, you saved my day. Is there a reason why for JsonObjectRequest the overloaded getParams method is not getting invoked ?Incredulous
The JsonObjectRequest is extended JsonRequest which override getBody() method directly, so your getParam() would never invoke,Balneology
thumbs up if you too got the problemBreathy
Can someone post the reason why JSONObjectRequest is not hitting getParams() but StringRequest is?Ivyiwis
A
3

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);
Ancillary answered 8/3, 2017 at 18:54 Comment(2)
Hi sir, what if i will pass two parameters? how can i put it on the third parameters of JsonObjectRequest.?Confine
This will require setting up the server to support POST data in JSON format. In PHP, that would mean doing something like this.Tactless
E
3

it happened because Volley params cache.

clean it like this

requestQueue.getCache().clear();

hope it's useful!😃

Epiphora answered 18/8, 2017 at 7:51 Comment(1)
I tried this but didn't work to solve the issue of getParams() not being called. \n\n RequestQueue queue = Volley.newRequestQueue(this); queue.getCache().clear();Reahard
A
2

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

Adamina answered 21/4, 2019 at 8:16 Comment(0)
D
1

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

Diatribe answered 3/8, 2015 at 9:50 Comment(0)
G
1

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.

Gimel answered 23/7, 2017 at 15:33 Comment(0)
S
0

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

Schulze answered 9/5, 2018 at 22:26 Comment(0)
M
0

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);
Mercie answered 16/5, 2018 at 16:58 Comment(0)
R
0

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

RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.getCache().clear();
requestQueue.add(stringRequest);
Remnant answered 24/6, 2019 at 16:6 Comment(0)
F
0

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

Feu answered 2/9, 2020 at 7:39 Comment(0)
R
0

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.

Reahard answered 18/3, 2022 at 15:40 Comment(0)
F
-1

if you use My Singleton try this:

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

Maybe you use cache on your code

Factorial answered 17/4, 2018 at 11:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.