最近使用 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 的话,应该怎样进行处理?先谢谢了!
我通过查看 RxJavaCallAdapterFactory 这个类的代码,自己解决了这个问题。
我发现当使用RxJava创建observables时,可以有三种不同的返回类型
Observable<Foo>
Observable<Response<Foo>>
Observable<Result<Foo>>
而Observable<Foo>这种返回类型的OnErrorAction里的throwable参数是HttpException这种类型的,这个HttpException里有 Response 对象,自然的,就可以拿到 errorBody 来进行我所想要的处理了。
我定义了一个类 ResponseError来接收错误消息的响应。
然后再定义了一个Action:
这样,在使用 Rxjava 链式操作的时候就可以这样了
记录在此,希望能帮到后面的朋友!