Волейбол не вызывает 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);
}
Ответы
Ответ 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();
Может быть, вы используете кеш в вашем коде