在Android中使用RxJava处理Restful Api格式的错误响应
最近使用 rxjava 搭配 retrofit 来进行网络访问 API,但不知道该怎样进行错误处理。
因为我的响应格式是这样的:
正确时:
{
"id": 1,
"username": "lazyS_WSD_Wd",
"mobile": "18912345678",
"email": "",
"avatar_url": "http://api.xxxx.com/images/default_avatar.png",
"last_address_id": 1,
"last_ip": "::1",
"last_device_type": "android",
"last_device_id": "99000566712916"
}
而不是这样的:
{
"status": 200,
"message": "请求成功",
"data": {
"id": 1,
"username": "lazyS_WSD_Wd",
"mobile": "18912345678",
"email": "",
"avatar_url": "http://api.xxxx.com/images/default_avatar.png",
"last_address_id": 1,
"last_ip": "::1",
"last_device_type": "android",
"last_device_id": "99000566712916"
}
}
错误时:
是这样的:
{
"message": "未找到该地址",
"status": 404,
}
这时的HTTP响应状态也是404
而不是这样的:
{
"status": 404,
"message": "未找到该地址",
"data": null
}
所以当请求成功,但返回的是用户自定义的错误时,我不能把该自定义的错误解析成指定的错误对象。
以前没有用 rxjava 时,我是这样处理的:
Response<T> response = call.execute();
if (BuildConfig.DEBUG) {
Logger.json(response.raw().toString());
}
if (response.isSuccess()) {
result = response.body();
} else {
responseError = GsonHelper.builderGson().fromJson(response.errorBody().string(), ResponseError.class);
}
请问如果用 rxjava 的话,应该怎样进行处理?先谢谢了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我的做法是将正常或者异常都封装到一个Result对象中。如果是成功可以通过getResult获取到我们需要的对象;失败时也可以拿到异常码和异常信息。
然后分两种情况处理异常。一种是直接retrofit2一次调用出现异常;另一种是一次调用拿到结果后又链式调用第二个api时,第一次出现异常。
第一种情况很简单。因为封装的BaseResult可以判断出是否发生异常(success字段)
第二种情况。可以选择链式,因为美观;也可以选择两次分开调用。如果两次分开调用的话,第一次的异常处理同上。如果选择链式:
参考:Retrofit+RxJava 优雅的处理服务器返回异常、错误http://blog.csdn.net/jdsjlzx/...
我通过查看 RxJavaCallAdapterFactory 这个类的代码,自己解决了这个问题。
我发现当使用RxJava创建observables时,可以有三种不同的返回类型
Observable<Foo>
Observable<Response<Foo>>
Observable<Result<Foo>>
而Observable<Foo>这种返回类型的OnErrorAction里的throwable参数是HttpException这种类型的,这个HttpException里有 Response 对象,自然的,就可以拿到 errorBody 来进行我所想要的处理了。
我定义了一个类 ResponseError来接收错误消息的响应。
然后再定义了一个Action:
这样,在使用 Rxjava 链式操作的时候就可以这样了
记录在此,希望能帮到后面的朋友!