Volly 解析VolleyError获取包体信息

作者: NapleC | 来源:发表于2016-04-02 10:57 被阅读1328次

在使用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<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;
}

注意看注释,@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。

相关文章

  • Volly 解析VolleyError获取包体信息

    在使用Volly开源框架时遇到了一个问题,报了错误只有一个 SERVERERROR , 那怎么办呢,找谷哥咯,贴上...

  • 【源码解析】 Volly

    【源码解析】 Volley的用法及源码解析 前言 Volley是谷歌在2013年I/O大会上推出的新的网络请求框架...

  • iOS硬解码 videoToolBox h264 hevc

    解码流程概要 从解码前视频队列里取出视频包解析NALU,获取vps、sps、pps、sei等信息根据获取到的参数信...

  • AndFix 的原理 --- 替换为补丁包的方法

    使用补丁包中的方法信息进行替换 1.在 Java 层获取 补丁包方法的信息 通过 DexFile 获取到补丁包中的...

  • Swift(2)

    可选类型(?) 隐式解析可选类型(!) 结构体 类 协议 扩展 闭包

  • 小程序获取用户位置与高德地图SDK经纬度逆地址解析

    最近接手写小程序项目,遇到了获取用户经纬逆解析地址的问题,记录如下: 微信小程序获取用户位置信息 逆地址解析(获取...

  • Flutter 获取App的版本号等信息

    获取APP包的信息 通过使用插件package_info可以获取到当前APP的包名,版本名,版本号等信息。 修改+...

  • 设备信息(US)

    获取设备的一些信息查看包名、版本号、设备信息、签名、进程IDiOS 如何获取设备信息

  • Flutter获取APP的包名版本等信息

    获取APP包的信息 通过使用插件package_info可以获取到当前APP的包名,版本名,版本号等信息。 添加依...

  • 短视频SDK

    1. 包体是否足够小 App 的包体大小,对获取用户有着至关重要的作用,特别是在线下的推广活动中,包体太大,下载费...

网友评论

本文标题:Volly 解析VolleyError获取包体信息

本文链接:https://www.haomeiwen.com/subject/jewylttx.html