`
xp9802
  • 浏览: 1208395 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Volley解析--BUG 之status code 问题

 
阅读更多

google i/o上的推出的volley框架 确实是很不错的,在使用的过程中也是很好扩展的,最近在做restful api时遇到问题,当服务器发送的响应头 低于200 大于299时就会异常,其实这是个bug ,在BasicNetwork 117行

                if (statusCode < 200 || statusCode > 299) {
                    throw new IOException();
                }

然后volley捕获异常

   catch (IOException e) {
                int statusCode = 0;
                NetworkResponse networkResponse = null;
                if (httpResponse != null) {
                    statusCode = httpResponse.getStatusLine().getStatusCode();
                } else {
                    throw new NoConnectionError(e);
                }
                VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
                if (responseContents != null) {
                    networkResponse = new NetworkResponse(statusCode, responseContents,
                            responseHeaders, false);
                    if (statusCode == HttpStatus.SC_UNAUTHORIZED ||
                            statusCode == HttpStatus.SC_FORBIDDEN) {
                        attemptRetryOnException("auth",
                                request, new AuthFailureError(networkResponse));
                    } else {
                        // TODO: Only throw ServerError for 5xx status codes.
                        throw new ServerError(networkResponse);
                    }
                } else {
                    throw new NetworkError(networkResponse);
                }
            }

也了解了一些解决办法 没有找到合适,

有说,修改服务器返回的状态码,有说自定义request  然后获取状态码再处理  这些请在stackoverflow自己搜索吧,喔感觉吧没什么用,毕竟有时候就是需要 这个状态码 做些操作,所以 我们需要自定义自己的Network,具体参考下文。

搜集的解决方法1:

public class GsonRequest<T> extends Request<T> {

    ...
    private int mStatusCode;

    public int getStatusCode() {
        return mStatusCode;
    }
    ...

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {

        mStatusCode = response.statusCode;
        try {
            Log.d(TAG, "[raw json]: " + (new String(response.data)));
            Gson gson = new Gson();
            String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(gson.fromJson(json, mClazz),
                HttpHeaderParser.parseCacheHeaders(response));

        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
    ...
}
public class myClazz extends FragmentActivity {


    private Request mMyRequest;
    ...

    public void makeNetworkCall() {
    mMyRequest = new MyNetworkRequest(
            Method.GET, 
            BASE_URL + Endpoint.USER,
            new Listener<String>() {

                @Override
                public void onResponse(String response) {
                    // Success

                }
            }, 
            new ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    if (mMyRequest.getStatusCode() == 401) {
                        // HTTP Status Code: 401 Unauthorized
                    }
                }
            });

    MyVolley.getRequestQueue().add(request);
}

 401 Not Supported by Volley

It turns out that it is impossible to guarantee that error.networkResponse is non-null without modifying Google Volley code because of a bug in Volley that throws the Exception NoConnectionError for Http Status Code 401 (HttpStatus.SC_UNAUTHORIZED) in BasicNetwork.java (134) prior to setting the value of networkResponse.

Work-Around

Instead of fixing the Volley code, our solution in this case was to modify the Web Service API to send Http Error Code 403 (HttpStatus.SC_FORBIDDEN) for the particular case in question.

 

For this Http Status Code, the value of error.networkResponse is non-null in the Volley error handler: public void onErrorResponse(VolleyError error). And, error.networkResponse.httpStatusCode correctly returns HttpStatus.SC_FORBIDDEN.

Other-Suggestions

Rperryng's suggestion of extending the Request<T> class may have provided a solution, and is a creative and excellent idea. Thank you very much for the detailed example. I found the optimal solution for our case is to use the work-around because we are fortunate enough to have control of the web services API.

 

I might opt for fixing the Volley code in one location within BasicNetwork.java if I did not have access to making a simple change at the server.

分享到:
评论

相关推荐

    网络请求框架volley-master

    网络请求框架volley-master网络请求框架volley-master

    android-volley-master.zip

    3. Android Tipshttp://dev.classmethod.jp/...4. Google I/O 2013 – Android : Volley: Easy, Fast Networking for Android http://y-anz-m.blogspot.jp/2013/05/google-io-2013-android-volley-easy-fast.html?m=1

    Volley-ImageLoader-Demo

    在“Volley-ImageLoader-Demo”中,我们主要探讨的是如何利用Volley框架中的ImageLoader组件来加载网络上的图片。下面将详细介绍Volley的ImageLoader及其在示例中的应用。 一、Volley框架 Volley是一个轻量级的...

    android-volley-master volley library。android开发之Google官方开源框架,著名的开源框架

    在"android-volley-master"这个项目中,包含了Volley库的完整源代码,开发者可以深入研究其内部实现,理解其工作原理,以便更好地利用Volley进行应用开发。同时,这个源码也是学习Android网络编程和框架设计的良好...

    volley-master包

    Volley 是 Google 推出的一款高效的网络请求库,专为 Android 应用设计,旨在简化网络操作并提高性能。在 Android Studio 中,你可以直接引入 `volley.jar` 包来快速实现网络通信功能,无需进行额外的压缩或解压操作...

    给android初学者的福利,网络通信框架volley-demo

    标题中的“给android初学者的福利,网络通信框架volley-demo”表明了这是一个关于Android开发的教程资源,特别关注的是Volley这个网络通信框架的实战示例。Volley是Google推出的一个高效的网络请求库,特别适合...

    Android开发-Volley-解析Json使用方法-完整Demo-AndroidStudio

    Android开发-Volley-解析Json使用方法-完整Demo-AndroidStudio http://blog.csdn.net/iwanghang/article/details/52241233

    volley联网解析网络上的xml文件

    解析XML时,要注意处理可能的编码问题。如果服务器返回的XML不是UTF-8编码,你需要在创建`XmlPullParser`时指定正确的编码。此外,考虑到XML的复杂性,你可能需要使用更高级的库,如`org.apache.xmlbeans`或`javax....

    Volley-demo-master

    在"Volley-demo-master"这个项目中,我们可以期待看到一些示例代码,这些代码展示了如何在实际应用中集成和使用 Volley。这可能包括了请求的创建、缓存配置、错误处理等关键部分,有助于开发者理解和学习 Volley 的...

    android-volley源码

    This is an unofficial mirror for [android volley library](https://android.googlesource.com/platform/frameworks/volley), the source code will synchronize periodically with the official volley ...

    使用Volley-jar的包

    在本项目中,"使用Volley-jar的包"是一个包含了Volley库的Android工程,目的是验证打包的Volley库是否能够正常工作。以下是对Volley库及其使用的详细解释。 1. **Volley的特点**: - **快速响应**:Volley通过内存...

    自定义Volley解析xml

    1. **错误处理**:确保在解析过程中捕获并处理可能出现的异常,如XML解析错误或网络问题。 2. **内存管理**:Volley会自动缓存响应,确保你的XML解析逻辑与Volley的缓存策略相一致。 3. **性能优化**:如果XML数据量...

    AndroidVolley-master

    AndroidVolley-masterAndroidVolley-masterAndroidVolley-

    android-volley-master 1.0.16

    Volley2015最新版 功能模块: 1. JSON,图像等的异步下载 ---------------------------------------------------- 2. 网络请求的排序(scheduling) ---------------------------------------------------- 3. ...

    最新版volley-6.0.jar

    google出的最新版volley的jar包,可以直接导入工程使用。

    1.Volley项目地址https-GitHub.com-smanikandan14-Volley-demo (1) JSON

    c 1.Volley项目地址https-GitHub.com-smanikandan14-Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(sche.zip

    Volley解析归属地查询

    Volley是Google推出的一款高效的网络请求库,专为Android平台设计,旨在简化网络通信和数据解析,提高应用程序的响应速度。在"Volley解析归属地查询"的项目中,我们看到开发者利用Volley来实现了一个功能,即通过...

    volley(解决中文乱码问题)

    Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。但官方原始的版本,对中文支持不行,需要修改源码。

    Android---Volley请求天气接口JSON解析

    本篇文章将详细讲解如何利用Volley库向天气接口发起请求,获取JSON数据,并进行解析,最终将天气信息格式化显示在用户界面上。 首先,我们需要在项目中引入Volley库。在`build.gradle`文件中添加依赖: ```gradle ...

    Volley-XUtils-OkHttp三种方式实现单张多张图片上传

    - 设置请求的监听器,处理可能的网络错误或服务器响应问题。 ### XUtils 图片上传 XUtils是一个功能丰富的Android开发框架,它包含了网络请求、数据库操作等功能。XUtils的图片上传主要依赖其`HttpUtils`类。 1....

Global site tag (gtag.js) - Google Analytics