[Android] Volley JsonObjectRequest Post参数不再起作用


Answers

你只需要从你的HashMap参数中创建一个JSONObject:

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

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

我已经阅读了类似问题的其他职位,但解决方案没有为我工作:

Volley JsonObjectRequest发布请求不起作用

在使用getHeader和getParams时,排除Post JsonObjectRequest忽略参数

排气不发送带有参数的发布请求。

我已经尝试在JsonObjectRequest构造函数中设置JSONObject为null,然后覆盖并设置“getParams()”,“getBody()”和“getPostParams()”方法中的参数,但是这些覆盖都没有工作我。 另一个建议是使用一个额外的帮助类,基本上创建一个自定义的请求,但这个修复是有点太复杂,我的需要。 如果出现这种情况,我会尽一切努力使其工作,但我希望有一个简单的理由,为什么我的代码工作,然后停下来 ,也是一个简单的解决方案。




使用JSONObject对象发送参数意味着参数将在HTTP POST请求正文中以JSON格式显示:

Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
params.put("tag2", "test2");
JSONObject jsonObj = new JSONObject(params);

将创建此JSON对象并将其插入到HTTP POST请求的主体中:

{"tag":"test","tag2":"test2"}

然后,服务器必须解码JSON以了解这些POST参数。

但是,通常HTTP POST参数是写在身体如下:

tag=test&tag2=test2

但现在这个问题是为什么Volley以这种方式设置?

一个读取HTTP POST方法的服务器应该按照标准总是尝试以JSON读取参数(纯文本除外),所以没有完成的服务器是一个糟糕的服务器?

或者,而不是在JSON参数的HTTP POST正文通常不是一个服务器想要的?




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

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



我有类似的问题。 但是我发现问题不在客户端,而是在服务器端。 当你发送一个JsonObject的时候,你需要像这样获取POST对象(在服务器端):

在PHP中

$ json = json_decode(file_get_contents('php:// input'),true);

希望这可以帮助!




你可以这样做:

CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
           // Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show();

            Log.d("response",""+response.toString());

            String status =  response.optString("StatusMessage");
            String actionstatus = response.optString("ActionStatus");
            Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show();
            if(actionstatus.equals("Success"))
            {
                Intent i = new Intent(SignActivity.this, LoginActivity.class);
                startActivity(i);
                finish();
            }
            dismissProgress();

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show();
            Log.d("response",""+error.toString());
            dismissProgress();
        }
    }) {
        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Email", emailval);
            params.put("PassWord", passwordval);
            params.put("FirstName", firstnameval);
            params.put("LastName", lastnameval);
            params.put("Phone", phoneval);
            return params;
        }

    };
    AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG);

按照下面的CustomRequest链接排除Volley JsonObjectRequest发布请求不起作用