Android官方通信框架Volley:解析VolleyError获取包体信息

上一篇Fiddler抓Android设备报文,虽然有了抓包工具,但是如果遇到HTTP 500这样的问题,还是很麻烦,有没有一种方法可以直接在LOGCAT中看到html报文内容呢,这样就可以快速的定位问题。

现在网络上的教程对于HTTP请求错误都是这样处理的:

StringRequest stringRequest = new StringRequest(“http://www.baidu.com”,
new Response.Listener<String>() {
@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, Map<String, String> headers,
boolean notModified) {
this.statusCode = statusCode;
this.data = data;
this.headers = headers;
this.notModified = notModified;
}

public NetworkResponse(byte[] data) {
this(HttpStatus.SC_OK, data, Collections.<String, String>emptyMap(), false);
}

public NetworkResponse(byte[] data, Map<String, String> 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 Map<String, String> headers;

/** 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。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值