我在android中使用Volley调用web服务。我在日志中有以下错误
D/libc-netbsd: [getaddrinfo]: hostname=192.168.66.86; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd: [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
D/libc-netbsd: [getaddrinfo]: hostname=192.168.66.86; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd: [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
I/System.out: [CDS]rx timeout:2500
I/System.out: [socket][2] connection /123.231.66.86:8080;LocalPort=56586(2500)
I/System.out: [CDS]connect[/192.168.66.86:8080] tm:2
I/System.out: [socket][/192.168.8.104:56586] connected
I/System.out: [OkHttp] sendRequest>>
I/System.out: OkBuffer write source.head == null !
I/System.out: [OkHttp] sendRequest<<
I/System.out: Close in OkHttp:0
I/System.out: [CDS]close[56586]
E/Volley: [2259] BasicNetwork.performRequest: Unexpected response code 400 for http://192.168.66.86:8080/jlrloyalty/rest/usr/login
D/Volley: [1] 2.onErrorResponse: JsonRequestActivity
我的代码就像这样
private void makeJsonObjReq() {
showProgressDialog();
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
Const.URL_STRING_REQ, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
msgResponse.setText(response.toString());
hideProgressDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hideProgressDialog();
}
}) {
/**
* Passing some request headers
* */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
return headers;
}
@Override
public byte[] getBody() {
return super.getBody();
}
@Override
protected Map<String, String> getParams() {
Gson gson = new Gson();
LoginAccount loginAccount = new LoginAccount();
HTTPWebServiceRequest httpWebServiceRequest = new HTTPWebServiceRequest();
loginAccount.setUsername("neshan");
loginAccount.setPassword("123456");
httpWebServiceRequest.setRequestObject(loginAccount);
String jsonParam = gson.toJson(loginAccount);
Map<String, String> params = new HashMap<String, String>();
params.put("requestObject", jsonParam);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq,
tag_json_obj);
但是当我使用以下参数从Postman调用此URL时,它可以正常工作。
{"requestObject":{"password":"123456","username":"neshan","loginId":0}}
当我调试代码时,请求参数都是相同的。内容类型为application/json
。但是这里发生了什么?任何线索?
答案 0 :(得分:1)
在排球中你有单独的成功和错误监听器,处理错误监听器块中的所有错误。
显示一个警告左右,您可以在其中向用户显示正确的消息,以便他收到通知,表示存在错误,他需要重试。
否则,如果您出于特定原因使用自定义错误代码,则可以通过创建自己的错误侦听器来实现全局处理,该错误侦听器实现了volley的Response.ErrorListener。
Google“凌空错误处理一般化”你会得到一些参考资料。
答案 1 :(得分:0)
覆盖getBody方法如下:
public byte[] getBody() throws AuthFailureError {
Map<String, String> params = getParams();
if (params != null && params.size() > 0) {
if (getBodyContentType().equals("application/json")) {
return params.get("json").getBytes(getParamsEncoding());
}
else
return encodeParameters(params, getParamsEncoding());
}
return null;
}
byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
StringBuilder encodedParams = new StringBuilder();
try {
if (getBodyContentType().equals("application/json")) {
JSONObject obj=new JSONObject(params);
obj.toString().getBytes(paramsEncoding);
} else {
for (Map.Entry<String, String> entry : params.entrySet()) {
encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
encodedParams.append('=');
encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
encodedParams.append('&');
}
return encodedParams.toString().getBytes(paramsEncoding);
}
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}