【发布时间】:2017-09-21 23:30:01
【问题描述】:
有什么方法可以在 Retrofit 上实现 Converter 来处理 40x 错误的正文?
服务器的响应有 40x 代码和空正文消息,每次返回和 EOFException 时,我都会遇到问题。
我已经实现了一个转换器,但是当它出现 40 倍错误时,它并没有通过它。
改造:
Gson gson = new GsonBuilder().create();
Retrofit.Builder builder = new Retrofit.Builder()
.addConverterFactory(new NullOnEmptyConverterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(url);
builder.client(okHttpClientBuilder.build());
这是我处理服务器调用错误的地方:
public static <T> ObservableTransformer<T, T> parseHttpErrors() {
return observable -> observable.onErrorResumeNext(
(Throwable throwable) -> {
if (throwable instanceof HttpException) {
int errorCode = ((HttpException) throwable).response().code();
return validateHttpExceptions(throwable, errorCode);
} else if (throwable instanceof IOException) {
return Observable.error(new NetworkException());
}
return Observable.error(throwable);
});
}
private static <T> ObservableSource<? extends T> validateHttpExceptions(Throwable throwable, int errorCode) {
switch (errorCode) {
case 401:// Request Unauthorized
return Observable.error(new CredentialsException());
case 408:// Request Timeout
return Observable.error(new NetworkException());
default:
return Observable.error(new UnknownHttpException(errorCode, throwable.getMessage()));
}
}
和单个服务器调用
service.doAction(params)
.subscribeOn(Schedulers.io())
.compose(NetworkErrorHandler.parseHttpErrors())
.map(data -> {
//map data
return data;
});
【问题讨论】:
-
你在使用 RxJava 吗?
-
是的,RxJava 2
-
我有类似 onErrorResumeNext 的东西。这里的问题是,当我捕捉到异常不是 HttpException 而是 EOFException 时。因此,例如,我无法正确处理 403 错误。