web-dev-qa-db-fra.com

Volley n'appelant pas getParams () pour standard POST demande

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

}
14
Varun Jain

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);
28
Ali Azhar

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

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

1
bigtree

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.

1
idsider

Essayez d’utiliser shouldCache(false) pour votre objet de requête avant de l’ajouter à la file d’attente.

0
SergeA

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);
0
Abu Yousuf