在使用Volly开源框架时遇到了一个问题,报了错误只有一个 SERVERERROR , 那怎么办呢,找谷哥咯,贴上搜索下发现是服务器的响应的一个错误,最有可能的4xx或5xx HTTP状态代码。
一般我们使用Volly打印日志是用 Log.e(“VolleyError—”, volleyError.getMessage(), volleyError);
打印出的错误信息非常有限,如下面一些
null
com.android.volley.ServerError
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:145)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)
以及 Volley框架打印的错误
BasicNetwork.performRequest: Unexpected response code 500 for
这些也仅只能判断是服务器端出现问题,但是究竟是什么原因,请求的参数不正确?还是服务器端哪里不对了?凭借以上信息个人一般无法判断。
判断不出,那只能想办法了,从哪突破呢,既然是 VolleyError 抛出错误,那我们来分析一下抛出错误的VolleyError类吧。
这里开始推轮子,贴源码
public class VolleyError extends java.lang.Exception {
public final com.android.volley.NetworkResponse networkResponse;
public VolleyError() { /* compiled code */ }
public VolleyError(com.android.volley.NetworkResponse response) { /* compiled code */ }
public VolleyError(java.lang.String exceptionMessage) { /* compiled code */ }
public VolleyError(java.lang.String exceptionMessage, java.lang.Throwable reason) { /* compiled code */ }
public VolleyError(java.lang.Throwable cause) { /* compiled code */ }
}
看到这里,我们猜测 networkResponse 这个对象含有返回的全部消息。
再打开 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 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.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 Map headers;
/** True if the server returned a 304 (Not Modified). */
public final boolean notModified;
}
注意看注释,@param data Response body 于是我们知道data是回应报文的包体内容,只要把data解码并显示出来,那么就有可能看到更详细的错误信息,最起码是一段HTML文档。
接下来我们只需要把data解码获取:
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("VolleyError---", volleyError.getMessage(), volleyError);
byte[] htmlBodyBytes = volleyError.networkResponse.data; //回应的报文的包体内容
Log.e("VolleyError body---->", new String(htmlBodyBytes), volleyError);
return;
}
}
经过这样改造后,logcat中的错误输出信息就变得很详细和清晰了。