Volley Post 请求在 onResponse 内没有返回响应
Posted
技术标签:
【中文标题】Volley Post 请求在 onResponse 内没有返回响应【英文标题】:Volley Post request returns no response inside onResponse 【发布时间】:2018-01-01 17:26:55 【问题描述】:所以我想打印响应的结果,然后使用 gson 为模型生成数据,但是响应永远不会返回,还调用了 onResponse。!
如果您注意到 Logcat,onResponse 中的 log.i 没有显示..!?但是在使用这个请求的Activity的onSuccess里面,它正常显示日志,但是如果日志包含响应对象,它不会显示很奇怪,没有任何意义..!?
Logcat
I/getUrl:: http://1925.232.55/login.php
I/getParams:: username =samy, password=123456
D/libc: [NET] android_getaddrinfofornetcontext+,hn 20(0x6),sn(),hints(known),family 0,flags 1024, proc=com...
D/libc: [NET] android_getaddrinfo_proxy get netid:0
D/libc: [NET] android_getaddrinfo_proxy-, success
I/onSuccess:: check /* this log inside the Activity which uses this request */
我尝试使用具有相同 url 和参数的 PostMan 测试请求 它正常返回json响应..?
邮递员回复
"status": "success",
"user_id": "10",
"user_name": "samy",
"full_name": "samy samy",
"picture": "st_pictures/IMG_085207.jpg",
"level": "1",
"school": "NY School",
"city": "NY",
"class": "6",
"age": "22",
"teacher": "2",
"token": "f808e758sdfsdfsf162dbdfcf88e3dc8a96"
请求代码
final RequestQueue queue = Volley.newRequestQueue(context);
final StringRequest sr = new StringRequest(Request.Method.POST, getLoginURL(), new Response.Listener<String>()
@Override
public void onResponse(String response)
Log.i("onResponse: ", response + "");
requestResult.onSuccess(response);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
requestResult.onFail(error);
VolleyLog.e("Error: ", error.getMessage());
error.printStackTrace();
)
@Override
protected Map<String, String> getParams()
Map<String, String> params = new HashMap<String, String>();
params.put("username ", un);
params.put("password", pass);
Log.i( "getParams: ", params.toString());
return params;
@Override
public byte[] getBody() throws AuthFailureError
Log.i( "getUrl: ",getUrl());
return super.getBody();
;
queue.add(sr);
更新 #1
网址http://clients.intertech.ps/raz/std.php
E/Volley: [1] 2.onErrorResponse: Error:
W/System.err: com.android.volley.ParseError: org.json.JSONException: End of input at character 0 of
W/System.err: at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:73)
W/System.err: at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:123)
W/System.err: Caused by: org.json.JSONException: End of input at character 0 of
W/System.err: at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:97)
W/System.err: at org.json.JSONObject.<init>(JSONObject.java:156)
W/System.err: at org.json.JSONObject.<init>(JSONObject.java:173)
W/System.err: at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:68)
W/System.err: ... 1 more
【问题讨论】:
第一个日志是`1925.232.55/login.php`我认为你的网址是错误的 @OussemaAroua 这个是假的,要我换成真的吗? 没必要我只是在检查它是否真实 如果我添加来自 Postman 的回复对您有帮助吗..! 如果可以的话请同意 【参考方案1】:很久以前有人问过这个问题,但我也遇到了同样的问题,几个小时后我才用 Volley 解决了这个问题
使用 StringRequest
而不是 JsonObjectRequest,出于任何原因,我在 JOR 上遇到了很多问题,我使用了 @Oussema Aroua 的 getHeaders
函数
final Response.Listener<String> responseListener = new Response.Listener<String>()
@Override
public void onResponse(String response)
Log.d("RESPONSE", String.valueOf(response));
;
final Response.ErrorListener errorListener = new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
//Handle your errors
;
StringRequest request = new StringRequest(Request.Method.POST, url,
responseListener, errorListener)
@Override
protected Map<String, String> getParams()
Map<String, String> params = new HashMap<>();
//Put your params for post
return params;
@Override
public Map<String, String> getHeaders()
Map<String,String> params = new HashMap<>();
params.put("Content-Type","application/x-www-form-urlencoded"); //-> this is the key
return params;
;
.. 你会在onResponse
中得到来自服务器的json响应
【讨论】:
【参考方案2】:你必须使用JsonObjectRequest
,像这样:
HashMap<String, String> params = new HashMap<String, String>();
params.put("username","samy");
params.put("password","123456");
JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
new Response.Listener<JSONObject>()
@Override
public void onResponse(JSONObject response)
Gson gson = new Gson();
YourClass yourClass = gson.fromJson(response.toString(), yourClass.class);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
//error
);
【讨论】:
它不起作用,它给了我与@OussemaAroua
答案相同的错误,请参阅更新 #1 以获得完整的 logcat
你能仔细检查你的 json 响应吗,可能格式不正确
再次查看更新#1,我将发布真正的url
,在邮递员中使用它和婴儿车,自己看看。!
我收到空白回复
对不起,请使用这个用户名“layal”而不是 samy【参考方案3】:
这不是StringRequest
,您需要使用JsonObjectRequest
,因为您的回复以开头
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
url, null,
new Response.Listener<JSONObject>()
@Override
public void onResponse(JSONObject response)
Log.d(TAG, response.toString());
requestResult.onSuccess(response);
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
VolleyLog.d(TAG, "Error: " + error.getMessage());
requestResult.onFail(error);
);
尝试在getParams
下添加:
@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");
return params;
[更新]:
我不知道为什么 volley 不起作用,但我更改为 ion
link 并且它起作用了:
Ion.with(this)
.load("http://clients.intertech.ps/raz/std.php")
.setBodyParameter("username", "layal")
.setBodyParameter("password", "123456")
.asJsonObject()
.setCallback(new FutureCallback<JsonObject>()
@Override
public void onCompleted(Exception e, JsonObject jsonObject)
Log.e("TAG", "onCompleted: " + jsonObject.toString());
);
【讨论】:
我将其更改为 JsonObjectRequest 并且此错误显示:` E/Volley: [1] 2.onErrorResponse: Error: org.json.JSONException: End of input at character 0 of ` 服务器的响应为空,不返回任何内容 我遇到了,同样的问题,再次查看更新#1,我将发布真正的url
,在邮递员中使用它和婴儿车,自己看看。!
好像php文件没有获取用户名和密码,尝试添加if (!isset($_POST["username"]) echo "empty username"
web端逻辑不是我写的,就是这样给我的,不知道web api是谁做的!以上是关于Volley Post 请求在 onResponse 内没有返回响应的主要内容,如果未能解决你的问题,请参考以下文章
Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数
如何在 Volley 的 POST 请求中将整数作为参数传递?