在Retrofit中使用200响应代码映射错误响应

bot*_*aap 1 android retrofit

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

Jak*_*ton 5

这是应用程序级别的区别,这意味着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);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您正在使用实验性的RxJava支持,则应该Observable通过提取错误的内容进行映射.

    service.doSomething()
        .map(new Func1<SomethingResponse, SomethingResponse>() {
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(..);
    
    Run Code Online (Sandbox Code Playgroud)
  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;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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