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

时间:2014-06-04 15:24:26

标签: android retrofit

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

2 个答案:

答案 0 :(得分: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);
    }
    
  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自动为每个方法执行此操作!)

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

答案 1 :(得分:1)

Converter中的{{1}}:

可以查看此内容
  

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