Java 截击Post请求在onResponse内不返回响应
所以我想打印响应的结果,然后使用gson为模型生成数据,但是响应永远不会返回,直到调用onResponse 如果您注意到Logcat,则log.i Inner onResponse没有显示。。!?但是在使用此请求的活动的onSuccess中,它通常会显示日志,但是如果日志包含响应对象,它就不会显示非常奇怪且没有任何意义的对象 LogcatJava 截击Post请求在onResponse内不返回响应,java,android,json,post,android-volley,Java,Android,Json,Post,Android Volley,所以我想打印响应的结果,然后使用gson为模型生成数据,但是响应永远不会返回,直到调用onResponse 如果您注意到Logcat,则log.i Inner onResponse没有显示。。!?但是在使用此请求的活动的onSuccess中,它通常会显示日志,但是如果日志包含响应对象,它就不会显示非常奇怪且没有任何意义的对象 Logcat I/getUrl:: http://1925.232.55/login.php I/getParams:: {username =samy, password
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);
它不是一个
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);
}
});
[更新]:
我不知道为什么with volley不起作用,但我改成了ion,它起作用了:
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());
}
});
Ion.with(这个)
.加载(“http://clients.intertech.ps/raz/std.php")
.setBodyParameter(“用户名”、“layal”)
.setBodyParameter(“密码”,“123456”)
.asJsonObject()
.setCallback(新的FutureCallback(){
@凌驾
未完成公共无效(异常e,JsonObject JsonObject){
Log.e(“TAG”,“onCompleted:+jsonObject.toString());
}
});
您必须使用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
}
});
HashMap params=newhashmap();
参数put(“用户名”、“samy”);
参数put(“密码”、“123456”);
JsonObjectRequest req=新JsonObjectRequest(URL,新JSONObject(参数),
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
Gson Gson=新的Gson();
YourClass YourClass=gson.fromJson(response.toString(),YourClass.class);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//错误
}
});
这个问题很久以前就被问到了,但我也遇到了同样的问题,几个小时后我用截击的方式解决了这个问题
使用了StringRequest
而不是JsonObjectRequest,出于任何原因,我在JOR上遇到了很多问题,我使用了的getHeaders
函数
final Response.Listener responseListener=new Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
Log.d(“响应”,String.valueOf(响应));
}
};
final Response.ErrorListener ErrorListener=新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//处理你的错误
}
};
StringRequest=新的StringRequest(request.Method.POST,url,
响应侦听器,错误侦听器){
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
//把你的情人送去邮局
返回参数;
}
@凌驾
公共映射getHeaders(){
Map params=新的HashMap();
params.put(“内容类型”,“应用程序/x-www-form-urlencoded”);//->这是关键
返回参数;
}
};
…您将在
onResponse
中从服务器获得json响应,第一个日志是``我想您的url是wrong@OussemaAroua这是一个虚拟的,你想让我用真实的替换它吗?不需要,我只是在检查它是不是真实的。如果我添加来自邮递员的回复,会对你有帮助吗?是的,如果你可以的话我将其更改为JsonObjectRequest,此错误显示:`E/Volley:[1]2.OneErrorResponse:Error:org.json.JSONException:End of character 0处的输入“来自服务器的响应是空的,它没有返回任何结果,同样的问题,请再次查看更新#1,我将发布真实的url
,在邮递员中与PRAM一起使用,然后自己查看。!它的行为就像php文件没有获得用户名和密码一样,请尝试addif(!isset($_POST[“username”])回显“空username”
我没有编写web端逻辑,它是这样给我的,我不知道是谁编写了web api!它不起作用,它给我的错误与@oussemaroua
回答的错误相同,请参阅更新#1获取完整日志。你能再检查一下你的json响应吗,可能格式不太好再次查看更新#1,我将发布真正的url
,u把它和婴儿车放在邮递员那个里,你们自己看看!我得到一个空白的回复,请用这个用户名“layal”代替samy
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());
}
});
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
}
});
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;
}
};