[Android] Volley JsonObjectRequest Post参数不再有效


Answers

我最终使用了Volley的StringRequest,因为我在尝试使JsonObjectRequest工作时花费了太多宝贵的时间。

RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";

StringRequest strRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
                    }
                })
        {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "test");
                return params;
            }
        };

queue.add(strRequest);

这对我有用。 它就像JsonObjectRequest一样简单,但使用的是String。

Question

我正在尝试在Volley JsonObjectRequest中发送POST参数。 最初, 通过遵循官方代码所说的传递包含JsonObjectRequest的构造函数中的参数的JSONObject来为我工作 。 然后它突然停止工作,我没有对以前工作的代码进行任何更改。 服务器不再识别正在发送任何POST参数。 这是我的代码:

RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";

// POST parameters
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");

JSONObject jsonObj = new JSONObject(params);

// Request a json response from the provided URL
JsonObjectRequest jsonObjRequest = new JsonObjectRequest
        (Request.Method.POST, url, jsonObj, new Response.Listener<JSONObject>()
        {
            @Override
            public void onResponse(JSONObject response)
            {
                Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show();
            }
        },
        new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
            }
        });

// Add the request to the RequestQueue.
queue.add(jsonObjRequest);

这是服务器上的简单测试程序PHP代码:

$response = array("tag" => $_POST["tag"]);
echo json_encode($response);

我收到的回复是{"tag":null}
昨天,它工作正常,并回复{"tag":"test"}
我没有改变任何一件事,但今天它已经不再适用了。

在Volley源代码构造函数javadoc中,它表示您可以在构造函数中传递JSONObject以在“@param jsonRequest”发送post参数: https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java ://android.googlesource.com/platform/frameworks/volley/+/master/src https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java

/ **
*创建一个新请求。
* @param方法使用HTTP方法
* @param url从中获取JSON的URL
* @param jsonRequest用{@link JSONObject}发布请求。 Null是允许的
*表示不会随请求一起发布参数。

我已阅读其他类似问题的帖子,但解决方案对我没用:

Volley JsonObjectRequest发布请求不起作用

使用getHeader和getParams时,Volley Post JsonObjectRequest忽略参数

Volley没有发送带参数的帖子请求。

我已经尝试将JsonObjectRequest构造函数中的JSONObject设置为null,然后覆盖并设置“getParams()”,“getBody()”和“getPostParams()”方法中的参数,但这些覆盖中没有一个适用于我。 另一个建议是使用一个基本上创建自定义请求的辅助类,但该修复对我的需求来说有点过于复杂。 如果归结为它我会做任何事情来使它工作,但我希望有一个简单的原因,为什么我的代码工作,然后停止 ,也是一个简单的解决方案。




您可以使用StringRequest执行与JsonObjectRequest相同的操作,同时仍然可以轻松发送POST参数。 你唯一要做的就是从你得到的请求String中创建一个JsonObject,然后从那里继续,就像它是JsonObjectRequest一样。

StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //Creating JsonObject from response String
                            JSONObject jsonObject= new JSONObject(response.toString());
                            //extracting json array from response string
                            JSONArray jsonArray = jsonObject.getJSONArray("arrname");
                            JSONObject jsonRow = jsonArray.getJSONObject(0);
                            //get value from jsonRow
                            String resultStr = jsonRow.getString("result");
                        } catch (JSONException e) {

                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> parameters = new HashMap<String,String>();
                        parameters.put("parameter",param);

                        return parameters;
                    }

                };
                requestQueue.add(stringRequest);



它确实有效。
我使用以下方法解析了json对象响应: - 就像一个魅力。

String  tag_string_req = "string_req";
        Map<String, String> params = new HashMap<String, String>();
        params.put("user_id","CMD0005");

        JSONObject jsonObj = new JSONObject(params);
String url="" //your link
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                url, jsonObj, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("responce", response.toString());

                try {
                    // Parsing json object response
                    // response will be a json object
                    String userbalance = response.getString("userbalance");
Log.d("userbalance",userbalance);
                    String walletbalance = response.getString("walletbalance");
                    Log.d("walletbalance",walletbalance);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });

        AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req);

祝你好运! 晚安!




我有类似的问题。 但我发现问题不在服务器端,但问题在于缓存。 您必须清除RequestQueue缓存。

RequestQueue requestQueue1 = Volley.newRequestQueue(context);
requestQueue1.getCache().clear();



使用here提到的CustomJsonObjectRequest帮助器类。

并执行这样的 -

CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show();
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", id);
        params.put("password", password);
        return params;
    }
};
VolleySingleton.getInstance().addToRequestQueue(request);



Links