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

标签 android retrofit

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

最佳答案

这是一个应用程序级别的区别,这意味着 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。它不负责将应用程序级行为或约束应用于请求或响应数据。这仍然是您的责任。

关于android - 在 Retrofit 中使用 200 响应代码映射错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041480/

相关文章:

android - 未在 ListView 中调用子类化的 RelativeLayout onDraw() 方法

java - 应用程序从用户那里获取二进制输入,并在 Android Studio 中按下按钮时闪烁手电筒传输输入

java - Retrofit 是如何转化为对象的?

java - 使用 retrofit 和 rxjava 重复调用 API

java - Retrofit 不会从 Android 将 Java 对象作为 PHP 后端的 POST 参数传递

android - 何时使用 ContextCompat 类

android - 如何读取安卓 :src in my custom component

android - 如何打开sdcard内存并选择pdf文件以获取其在android中上传的路径

java - Android Retrofit连接JAVA套接字

java - 在 PartMap 中使用 Retrofit 和 WebKitFormBoundary 将文件发送到服务器