【问题标题】:Mapping error responses with 200 response code in Retrofit在 Retrofit 中使用 200 响应代码映射错误响应
【发布时间】:2014-06-06 14:34:11
【问题描述】:

我正在处理一个我无法控制的 API,它以 JSON 格式返回错误响应,但在这种情况下不返回非 200 响应代码。使用 Retrofit 时,是否仍然有可能在失败回调中获得任何错误(由“错误”属性的存在确定)?可以肯定地假设我可以通过查看消息内容来识别来自该 API 的错误响应。

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    这是一个应用程序级别的区别,这意味着 Retrofit 不(也不应该)关心它。

    有三种方法可以实现你想要的,每一种都对应一个 Retrofit 的行为。

    1. 对于异步调用,您可以使用执行映射的自定义 Callback 子类型。

      public abstract class MyCallback<T extends MyResponse> implements Callback<T> {
        @Override public final void success(T data, Response response) {
          if (!data.success) {
            success(data);
          } else {
            error(data.error, response);
          }
          // This is just an example of what a potential common handler could look like.
        }
        public abstract void success(T data);
        public abstract void httpError(Error error, Response response);
      }
      
    2. 如果您使用的是实验性 RxJava 支持,您应该通过提取错误的东西映射 Observable

      service.doSomething()
          .map(new Func1<SomethingResponse, SomethingResponse>() {
          })
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(..);
      
    3. 最后,对于同步,您显然可以在每个调用站点进行检查,但您也可以封装 API。

      public final class WrappedService implements Service {
        private final Service real;
      
        @Override public SomethingResponse doSomething() {
          return handleError(real.doSomething());
        }
      
        private static <T extends MyResponse> T handleError(T data) {
          if (!data.success) {
            throw new SomeException(data.error);
          }
          return data;
        }
      }
      

      (提示:您也可以使用Proxy 为每个方法自动执行此操作!)

    这里要记住的重要一点是,Retrofit 的职责是将您的 HTTP API 映射到 Java API。它不负责将应用程序级别的行为或约束应用于请求或响应数据。这仍然是你的责任。

    【讨论】:

      【解决方案2】:

      看起来这在Converter 中是可能的,来自javadoc

      ConversionException - 如果转换无法完成。这将触发调用 Callback.failure(retrofit.RetrofitError) 或抛出一个 RetrofitError。异常消息 应报告有关其原因的所有必要信息,因为响应机构将设置为 空。

      【讨论】:

        猜你喜欢
        • 2013-09-08
        • 1970-01-01
        • 2021-10-21
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 2017-05-27
        • 2018-05-16
        • 2014-09-21
        相关资源
        最近更新 更多