'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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
