J'essaie de publier des paramètres sur mon API Rails à l'aide de Volley sous Android. C'est le code:
J'ai essayé avec deux instructions de journal, une dans getParams()
et une autre dans getHeaders()
. Celui de getHeaders()
est enregistré alors que l’autre ne l’est pas. Pourquoi la volée ignore-t-elle 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);
}
Utilisation de StringRequest à la place de 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);
Le troisième paramètre doit être un objet JSON. Vous n'avez pas besoin de la méthode getParams (), mais simplement de le transmettre à la demande.
JsonObjectRequest jsonObjReq = new JsonObjectRequest(
method,
url,
jsonObjParams, // <<< HERE
responseListener,
errorListener);
Veuillez remplacer la méthode getBody (). Si votre serveur ne peut pas gérer le paramètre de requête JSON, vous devez remplacer la méthode getHeaders () pour modifier votre type de contenu.
Le numéro peut être trouvé ici: https://github.com/mcxiaoke/Android-volley/issues/82
Pour JSONobjectRequest, la méthode getParams () ne fonctionne pas pour les demandes POST, vous devez donc créer une méthode customRequest et écraser la méthode getParams (). C'est parce que JsonObjectRequest est étendu JsonRequest qui redéfinit la méthode getBody () directement, de sorte que votre getParam () n'appelle jamais. Pour appeler votre méthode getParams (), vous devez d’abord remplacer getBody (). Ou pour une solution simple, vous pouvez utiliser StringRequest.
Essayez d’utiliser shouldCache(false)
pour votre objet de requête avant de l’ajouter à la file d’attente.
Pour fournir le paramètre POST
, créez une JSONObject
avec vos paramètres POST et transmettez-la JSONObject
en tant que troisième paramètre. Le constructeur JsonObjectRequest
accepte un constructeur JSONObject
qui est utilisé dans le corps de la demande.
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);