Volly 解析VolleyError获取包体信息

在使用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中的错误输出信息就变得很详细和清晰了。

Volley的异常列表:

  • AuthFailureError:如果在做一个HTTP的身份验证,可能会发生这个错误。
  • NetworkError:Socket关闭,服务器宕机,DNS错误都会产生这个错误。
  • NoConnectionError:和NetworkError类似,这个是客户端没有网络连接。
  • ParseError:在使用JsonObjectRequest或JsonArrayRequest时,如果接收到的JSON是畸形,会产生异常。
  • SERVERERROR:服务器的响应的一个错误,最有可能的4xx或5xx HTTP状态代码。
  • TimeoutError:Socket超时,服务器太忙或网络延迟会产生这个异常。默认情况下,Volley的超时时间为2.5秒。如果得到这个错误可以使用RetryPolicy。

你可能感兴趣的:(android)