Volley POST参数不起作用?

时间:2015-05-13 05:43:32

标签: android android-volley

以下是我的Volley POST方法Call。 POST参数没有将数据传递给Web服务器/ API几乎所有的尝试 1.覆盖byte [] getBody() 2.参数类型 3.使用JsonRequest

将四个POST参数解析到服务器并基于此进行响应。 这段代码中缺少什么?

private void generateTicket(final String field1, final String field2 , final String field3, final String field4) {

    StringRequest strReq = new StringRequest(Method.POST,
                    AppConfig.URL_GENERATION, new Response.Listener<String>() {

                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONObject jObj = new JSONObject(response);
                                boolean error = jObj.getBoolean("error");

                                // Check for error node in json
                                if (!error) {
                                // SUCCESS CODE GOES HEAR

                                } else {
                                    // Error in login. Get the error message
                                    String errorMsg = jObj.getString("msg");
                                    Toast.makeText(getApplicationContext(),
                                            errorMsg, Toast.LENGTH_LONG).show();
                                }
                            } catch (JSONException e) {
                                // JSON error
                                e.printStackTrace();
                            }

                        }
                    }, new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e(TAG, "API Error: " + error.getMessage());
                            Toast.makeText(getApplicationContext(),
                                    error.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }) {

                @Override
                protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {  
                    // Posting parameters to the url
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("tag", "generate");
                    params.put("field1", field1);
                    params.put("field2", field2);
                    params.put("field3", field3);
                    params.put("field4", field4);           
                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("Content-Type","application/x-www-form-urlencoded");
    //              params.put("Content-Type", "application/json");
                    return params;
                }

            };
            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

4 个答案:

答案 0 :(得分:1)

在将请求添加到队列之前,请尝试request.setShouldCache(false);。 我猜也许它会有所帮助。

默认情况下,volley会缓存响应。当它再次遇到网址时,它将从其缓存中获取而不是来自网络。即使重新安装应用程序(就像在调试中一样),缓存仍然在这里。但卸载和安装将清除缓存。

如果使用POST方法,请不要使用JsonRequest。它根本不会调用getParams()

答案 1 :(得分:1)

对于我来说,很奇怪的解决方案是

我的连接URL是

http://something.com/folder1/folder2

其中folder2包含一个index.php文件,用于处理请求。

更改为

http://something.com/folder1/folder2/ (在末尾添加/)解决了问题,服务器接收到POST数据

不知道为什么,但是我以前见过。几乎找不到答案,没有人谈论。希望这个答案可以对某人有所帮助。

答案 2 :(得分:0)

你收到任何错误吗?如果是这样,请更新您的帖子。代码看起来很好。 但是,如果仍有问题,可以使用以下代码

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(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();
                }
            }) {

        /**
         * Passing some request headers
         * */
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json");
            headers.put("apiKey", "xxxxxxxxxxxxxxx");
            return headers;
        }

    };

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

答案 3 :(得分:0)

这个对我有用(见Volley JsonObjectRequest Post parameters no longer work

String url = "https://www.youraddress.com/";

Map<String, String> params = new HashMap();
params.put("first_param", 1);
params.put("second_param", 2);

JSONObject parameters = new JSONObject(params);

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, parameters, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        //TODO: handle success
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
        //TODO: handle failure
    }
});

Volley.newRequestQueue(this).add(jsonRequest);