web-dev-qa-db-ja.com

Volleyが標準のPOSTリクエストに対してgetParams()を呼び出さない

Rails APIをAndroidでVolleyを使用してAPIに投稿しようとしています。これはコードです。

getParams()getHeaders()の2つのログステートメントを試しました。 getHeaders()の1つはログに記録され、もう1つはログに記録されません。なぜボレーは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);

}
15
Varun Jain

JsonObjectRequestの代わりにStringRequestを使用する

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

volley paramsキャッシュが原因で発生しました。

このようにきれいに

requestQueue.getCache().clear();

お役に立てれば幸いです!????

2
fansan

3番目のパラメーターはJSONObjectである必要があります。getParams()メソッドは要求に渡すだけでよいので不要です。

 JsonObjectRequest jsonObjReq = new JsonObjectRequest(
            method,
            url,
            jsonObjParams,    // <<< HERE
            responseListener,
            errorListener);
2
josh123a123

GetBody()メソッドをオーバーライドしてください。サーバーがJSONリクエストパラメータを処理できない場合は、getHeaders()メソッドをオーバーライドしてContent-Typeを変更する必要があります。

問題はここにあります: https://github.com/mcxiaoke/Android-volley/issues/82

1
bigtree

JSONobjectRequestの場合、getParams()はPOST要求に対して機能しないため、customRequestを作成し、その上でgetParams()メソッドをオーバーライドする必要があります。これは、JsonObjectRequestがgetBody()メソッドをオーバーライドする拡張JsonRequestであるためですgetParams()メソッドを呼び出すには、最初にgetBody()をオーバーライドする必要があります。簡単なソリューションの場合は、StringRequestを使用できます。

1
idsider

ヘッダーからContent-Typeを削除するだけで問題を解決しました:)

1
Rakshita

リクエストオブジェクトをキューに追加する前に、shouldCache(false)を使用してみてください。

0
SergeA

POSTパラメータを提供するには、POSTパラメータを使用してJSONObjectを作成し、そのJSONObjectを3番目のパラメータとして渡します。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);
0
Abu Yousuf

キューキャッシュのクリアを使用して解決したのと同じ問題がありました

RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.getCache().clear();
requestQueue.add(stringRequest);
0
Yasser