每次我尝试使用Volley的POST方法时,都会出现严重错误。我在getCause中得到null值,在getNetworkResponse.toString()中得到一些默认值。
如果我使用GET方法,这样可以正常工作(我从我的网址得到回复)。
有人可以帮我做什么吗?
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("teststr", "abd");
RequestQueue requestQueue = VolleySingleton.getInstance().getRequestQueue();
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.POST,
url,
new JSONObject(jsonParams),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Toast.makeText(getApplicationContext(), "Success"+response.toString(), Toast.LENGTH_LONG).show();
}catch(Exception e){
Toast.makeText(getApplicationContext(), "JSON ERROR", Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("abd", "Error: " + error
+ ">>" + error.networkResponse.statusCode
+ ">>" + error.networkResponse.data
+ ">>" + error.getCause()
+ ">>" + error.getMessage());
}
}) {
@Override
protected Map<String,String> getParams() {
HashMap<String, String> params = new HashMap<String, String>();
params.put("key", "value");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
requestQueue.add(request);
错误日志:
错误: 错误:com.android.volley.ServerError&gt;&gt; 404&gt;&gt; [B @ 42b1e0d0&gt;&gt; null&gt;&gt; null
更新 networkResponse.statusCode来自404,虽然可以访问url(如果我只使用GET方法则返回数据)。如果我在POST方法中删除标题部分,仍然是相同的。
网址:
<?php
$response = array();
$jsonString = file_get_contents('php://input');
$jsonObj = json_decode($jsonString, true);
if(!isset($jsonObj['teststr'])){
$response["msg"] = "No data.";
}else{
$response["msg"] = "Success: ".$jsonObj['teststr'];
}
echo json_encode($response);
?>
答案 0 :(得分:6)
首先,尝试确保您的服务器运行良好。 您可以使用Postman(chrome插件)或任何其他方式向网址发送帖子请求并查看其响应。
确保您的服务器没有问题后,让我们用排球解决问题。
使用POST方法时,JsonObjectRequest
存在一些问题。
像这样Volley JsonObjectRequest Post request not working。
我建议您先使用StringRequest
并像之前一样覆盖getParams
方法。在您完成此任务后,您可以尝试编写自己的请求,这不是非常困难但非常有用。
我还建议在request.setShouldCache(false)
之前添加requestQueue.add(request);
。默认情况下,volley将响应保存在其缓存中,这种行为可能会导致一些奇怪的问题。
答案 1 :(得分:2)
RequestQueue queue = Volley.newRequestQueue(this);
String URL = EndPoints.BASE_URL + "/call";
StringRequest request = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d("onResponse", response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
NetworkResponse response = error.networkResponse;
String errorMsg = "";
if(response != null && response.data != null){
String errorString = new String(response.data);
Log.i("log error", errorString);
}
}
}
) {
@Override
protected Map<String, String> getParams()
{
Map<String, String> params = new HashMap<String, String>();
params.put("key_1","value_1");
params.put("key_2", "value_2");
Log.i("sending ", params.toString());
return params;
}
};
// Add the realibility on the connection.
request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));
// Start the request immediately
queue.add(request);
和您的php(laravel)代码:
$response['success'] = true;
$response['user']['tell'] = $user->tell;
$response['user']['code'] = $user->code;
$response['user']['time'] = $time;
$response['user']['register_state'] = '1'
return response()->json($response, 200);
答案 2 :(得分:0)
好吧,我想你可以先在你的logcat中打印responseCode
答案 3 :(得分:0)
在添加到队列
之前添加此代码request.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
有时,请求在你的php完全执行之前超时。所以试试这个代码。也许可以帮忙
答案 4 :(得分:0)
Volley没有完美处理内置的POST方法参数,所以你需要创建一个自定义响应。
答案由katwal-Dipak在其他类似的帖子中发布。 https://stackoverflow.com/a/31532955/4969957
哪个工作正常。谢谢。
答案 5 :(得分:0)
也许它与您的运营商有关......
我和Volley一起发送JasonObject也有同样的问题。
我在9-10台设备上测试了我的应用程序,有两个不同的操作员。
一个操作符上的请求返回Error,其中包含所有null或空白数据,另一个操作符一切正常,我从API成功获得响应。
我不知道运营商做了什么导致了这个问题...... 也许他们使用某种阻止发送JsonObject的防火墙。
答案 6 :(得分:0)
我试图将响应显示为字符串,并且错误消失了。
在任何要显示错误或使用错误的地方使用response.toString()
。
答案 7 :(得分:0)
就我而言,答案是重试策略设置。 我将30秒的超时值设置为30000,而不是30。
答案 8 :(得分:-1)
尝试增加超时。我遇到了同样的问题,请求超时是问题所在。