Volley JsonObjectRequest Post参数不再起作用

我想在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); 

这里是服务器上简单的PHPtesting代码:

 $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

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

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

Volley JsonObjectRequest发布请求不起作用

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

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

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

我结束了使用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来代替。

你只需要从你的HashMap参数中创build一个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); 

你可以使用StringRequest和JsonObjectRequest做同样的事情,同时还可以轻松地发送POST参数。 你唯一需要做的就是从你得到的请求string中创build一个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); 

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

在PHP中

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

希望这可以帮助!

使用这里提到的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); 

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

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

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

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

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

 tag=test&tag2=test2 

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

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

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

可能帮助某人,并节省你一些时间思考。 我有类似的问题,服务器代码正在寻找内容types标题。 这是这样做的:

 if($request->headers->content_type == 'application/json' ){ //Parse JSON... } 

但是Volley正在发送这样的标题:

 'application/json; charset?utf-8' 

将服务器代码更改为这个诀窍:

 if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON... 

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

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

它确实有效。
我用这个parsing了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); 

祝你好运! 晚安!

你可以这样做:

 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发布请求不起作用

“…最初,它是为我工作….然后突然停止工作, 我没有做任何改变的代码”

如果您之前没有对之前的代码进行任何更改,那么我build议您检查其他参数(如URL) ,因为如果您将自己的计算机用作服务器,则IP地址可能会更改!