【问题标题】:What is the best way to handle an API Response top level in Android using Retrofit2?使用 Retrofit2 在 Android 中处理顶级 API 响应的最佳方法是什么?
【发布时间】:2023-03-07 10:54:01
【问题描述】:

我有一个具有用户登录系统的项目。在我的项目中,我使用的是Retrofit。如你所知,RetrofitonResponseonFailure 方法。

我想要实现的是在调用返回 401 错误时将用户注销。

第一个选项是每次调用 API 时注销它们,覆盖onResponse。我可以从调用response.getRaw().code()Response 对象获取 HTTP 状态代码,如果是 则注销用户401。但是,这不是一个好方法。

如果您对顶级处理这种情况有任何建议,那就太好了。

谢谢

【问题讨论】:

  • 您使用的是 Retrofit 还是 Retrofit2?请不要只添加两个标签。如果您使用 Retrofit2,则添加 Interceptor 是一种顶级方式
  • 抱歉,我不是故意要包括 Retrofit。我现在会修复它。我正在使用 Retrofit2。我也想过Interceptor,但是我的注销方法托管在Application类中,我该如何访问它?

标签: java android error-handling retrofit2


【解决方案1】:

如前所述,一种方法是使用Interceptors

您可以向您的OkHttp 客户端添加一个带有回调的拦截器,以拦截所有 401 请求。然后只需调用回调来通知您的侦听器。

请务必将其添加为 addNetworkInterceptor(),因为您需要实时数据并且可以安全地忽略缓存结果。

OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(new UnauthorizedInterceptor(myListener))
            .build();

一些关于它如何工作的示例代码(未测试):

public class UnauthorizedInterceptor implements Interceptor {
    private Callback mCallback;

    public UnauthorizedInterceptor(Callback callback) {
        mCallback = callback;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());

        if (originalResponse.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
            mCallback.onUserLoggedOut();
        }

        return originalResponse;
    }

    interface Callback {
        void onUserLoggedOut();
    }
}

【讨论】:

  • 感谢您的解释,我还有最后一个问题。在这一行中,.addNetworkInterceptor(new UnauthorizedInterceptor(myListener)) 是否在 createService 方法中传递了myListener
  • 这完全取决于您的架构和设计。我会将两者都放入我的应用程序/单例实例中,以便从应用程序中的任何位置访问它。所以我会将它添加到应用程序onCreate 中。就像很多事情一样,这个问题没有正确答案
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多