Volley没有为标准POST请求调用getParams()

时间:2014-06-18 11:43:09

标签: android android-volley

我正在尝试使用Android中的Volley将一些参数发布到我的rails API。这是代码:

我尝试了两个日志语句,一个在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);

}

11 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:2)

第三个参数应该是一个JSONObject,你不需要getParams()方法将它们传递给请求。

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

答案 2 :(得分:2)

这是因为Volley params缓存。

像这样清理它

requestQueue.getCache().clear();

希望它有用!

答案 3 :(得分:1)

请覆盖getBody()方法,如果您的服务器无法处理JSON请求参数,则必须覆盖getHeaders()方法以更改Content-Type。

问题可以在这里找到:https://github.com/mcxiaoke/android-volley/issues/82

答案 4 :(得分:1)

对于JSONobjectRequest,getParams()不适用于POST请求,因此您必须在那里进行customRequest并覆盖getParams()方法。因为JsonObjectRequest是扩展的JsonRequest,它直接覆盖getBody()方法,所以你的getParam()永远不会调用。要调用getParams()方法,首先必须覆盖getBody()。或者对于一个简单的解决方案,您可以使用StringRequest。

答案 5 :(得分:0)

在将请求对象添加到队列之前,请尝试使用shouldCache(false)

答案 6 :(得分:0)

要为POST参数提供一个JSONObject的POST参数,并将JSONObject作为第三个参数传递。 JsonObjectRequest构造函数接受在Request Body中使用的构造函数中的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);

答案 7 :(得分:0)

我只需从标题中删除Content-Type即可解决我的问题:

答案 8 :(得分:0)

我有同样的问题 我使用清除队列缓存解决了它

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

答案 9 :(得分:0)

只需使用requestQue.getCache()。clear();

答案 10 :(得分:-1)

如果您使用My Singleton,请尝试:

MyVolley.getInstance(this).getRequestQueue().getCache().clear();

也许您在代码中使用缓存