【问题标题】:retrofit2.Converter for handling error messagesretrofit2.Converter 用于处理错误消息
【发布时间】: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;
        });

【问题讨论】:

标签: android retrofit2 gson


【解决方案1】:

最后我找到了产生这个错误的原因。它是 HttpLoggingInterceptor。删除它后不再有 EOFException。

【讨论】:

  • 这很有趣。你试过用 Stetho 代替吗?
  • 好点,我之前确实使用过它,但不是用于网络。谢谢!
猜你喜欢
  • 2016-12-28
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多