上一篇Fiddler抓Android设备报文,虽然有了抓包工具,但是如果遇到HTTP 500这样的问题,还是很麻烦,有没有一种方法可以直接在LOGCAT中看到html报文内容呢,这样就可以快速的定位问题。
现在网络上的教程对于HTTP请求错误都是这样处理的:
StringRequest stringRequest = new StringRequest(“http://www.baidu.com”,
new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d(“TAG”, response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(“TAG”, error.getMessage(), error);
}
});
一句
Log.e(“TAG”, error.getMessage(), error);
打印出的错误信息非常有限:
08-20 20:48:03.606: E/LOGIN-ERROR(6656): null
08-20 20:48:03.606: E/LOGIN-ERROR(6656): com.android.volley.ServerError
08-20 20:48:03.606: E/LOGIN-ERROR(6656): at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:145)
08-20 20:48:03.606: E/LOGIN-ERROR(6656): at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)
加上Volley框架打印的错误
08-20 20:49:23.452: E/Volley(6656): [1437] BasicNetwork.performRequest: Unexpected response code 500 for
你也只能判断是服务器端出现问题,但是究竟是因为请求的参数或者方式不正确?还是服务器端哪里不对了?你是无法进一步做出改变的。
除了Fiddler抓包,就没有更好的办法了吗。
既然有错误抛出,那我们来分析一下抛出错误的VolleyError类吧。
上源码:
public class VolleyError extends Exception {
public final NetworkResponse networkResponse;public VolleyError() {
networkResponse = null;
}public VolleyError(NetworkResponse response) {
networkResponse = response;
}public VolleyError(String exceptionMessage) {
super(exceptionMessage);
networkResponse = null;
}public VolleyError(String exceptionMessage, Throwable reason) {
super(exceptionMessage, reason);
networkResponse = null;
}public VolleyError(Throwable cause) {
super(cause);
networkResponse = null;
}
}
发现有一个networkResponse对象,这个对象我们猜测含有返回的全部消息。
再打开这个类的源码。
public class NetworkResponse {
/**
* Creates a new network response.
* @param statusCode the HTTP status code
* @param data Response body
* @param headers Headers returned with this response, or null for none
* @param notModified True if the server returned a 304 and the data was already in cache
*/
public NetworkResponse(int statusCode, byte[] data, Mapheaders,
boolean notModified) {
this.statusCode = statusCode;
this.data = data;
this.headers = headers;
this.notModified = notModified;
}public NetworkResponse(byte[] data) {
this(HttpStatus.SC_OK, data, Collections.emptyMap(), false);
}public NetworkResponse(byte[] data, Map
headers) {
this(HttpStatus.SC_OK, data, headers, false);
}/** The HTTP status code. */
public final int statusCode;/** Raw data from this response. */
public final byte[] data;/** Response headers. */
public final Mapheaders; /** True if the server returned a 304 (Not Modified). */
public final boolean notModified;
通过看注释,我们得知,data是回应报文的包体内容,只要把data解码并显示出来,那么就有可能看到更详细的错误信息,最起码是一段HTML文档。如果网站开DEBUG模式,那么肯定会有详细的错误信息。
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(“LOGIN-ERROR”, error.getMessage(), error);
byte[] htmlBodyBytes = error.networkResponse.data;
Log.e(“LOGIN-ERROR”, new String(htmlBodyBytes), error);
}
}
经过这样改造后,logcat中的错误输出信息就变得很详细和清晰了。
Volley的异常列表:
AuthFailureError:如果在做一个HTTP的身份验证,可能会发生这个错误。
NetworkError:Socket关闭,服务器宕机,DNS错误都会产生这个错误。
NoConnectionError:和NetworkError类似,这个是客户端没有网络连接。
ParseError:在使用JsonObjectRequest或JsonArrayRequest时,如果接收到的JSON是畸形,会产生异常。
SERVERERROR:服务器的响应的一个错误,最有可能的4xx或5xx HTTP状态代码。
TimeoutError:Socket超时,服务器太忙或网络延迟会产生这个异常。默认情况下,Volley的超时时间为2.5秒。如果得到这个错误可以使用RetryPolicy。