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
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组件来加载网络上的图片。下面将详细介绍Volley的ImageLoader及其在示例中的应用。 一、Volley框架 Volley是一个轻量级的...
在"android-volley-master"这个项目中,包含了Volley库的完整源代码,开发者可以深入研究其内部实现,理解其工作原理,以便更好地利用Volley进行应用开发。同时,这个源码也是学习Android网络编程和框架设计的良好...
Volley 是 Google 推出的一款高效的网络请求库,专为 Android 应用设计,旨在简化网络操作并提高性能。在 Android Studio 中,你可以直接引入 `volley.jar` 包来快速实现网络通信功能,无需进行额外的压缩或解压操作...
标题中的“给android初学者的福利,网络通信框架volley-demo”表明了这是一个关于Android开发的教程资源,特别关注的是Volley这个网络通信框架的实战示例。Volley是Google推出的一个高效的网络请求库,特别适合...
Android开发-Volley-解析Json使用方法-完整Demo-AndroidStudio http://blog.csdn.net/iwanghang/article/details/52241233
解析XML时,要注意处理可能的编码问题。如果服务器返回的XML不是UTF-8编码,你需要在创建`XmlPullParser`时指定正确的编码。此外,考虑到XML的复杂性,你可能需要使用更高级的库,如`org.apache.xmlbeans`或`javax....
在"Volley-demo-master"这个项目中,我们可以期待看到一些示例代码,这些代码展示了如何在实际应用中集成和使用 Volley。这可能包括了请求的创建、缓存配置、错误处理等关键部分,有助于开发者理解和学习 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库的Android工程,目的是验证打包的Volley库是否能够正常工作。以下是对Volley库及其使用的详细解释。 1. **Volley的特点**: - **快速响应**:Volley通过内存...
1. **错误处理**:确保在解析过程中捕获并处理可能出现的异常,如XML解析错误或网络问题。 2. **内存管理**:Volley会自动缓存响应,确保你的XML解析逻辑与Volley的缓存策略相一致。 3. **性能优化**:如果XML数据量...
AndroidVolley-masterAndroidVolley-masterAndroidVolley-
Volley2015最新版 功能模块: 1. JSON,图像等的异步下载 ---------------------------------------------------- 2. 网络请求的排序(scheduling) ---------------------------------------------------- 3. ...
google出的最新版volley的jar包,可以直接导入工程使用。
c 1.Volley项目地址https-GitHub.com-smanikandan14-Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(sche.zip
Volley是Google推出的一款高效的网络请求库,专为Android平台设计,旨在简化网络通信和数据解析,提高应用程序的响应速度。在"Volley解析归属地查询"的项目中,我们看到开发者利用Volley来实现了一个功能,即通过...
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。但官方原始的版本,对中文支持不行,需要修改源码。
本篇文章将详细讲解如何利用Volley库向天气接口发起请求,获取JSON数据,并进行解析,最终将天气信息格式化显示在用户界面上。 首先,我们需要在项目中引入Volley库。在`build.gradle`文件中添加依赖: ```gradle ...
- 设置请求的监听器,处理可能的网络错误或服务器响应问题。 ### XUtils 图片上传 XUtils是一个功能丰富的Android开发框架,它包含了网络请求、数据库操作等功能。XUtils的图片上传主要依赖其`HttpUtils`类。 1....