使用 Retrofit2 处理 Android 中的 API 响应顶级的最佳方法是什么?
What is the best way to handle an API Response top level in Android using Retrofit2?
我有一个项目有用户登录系统。在我的项目中,我使用 Retrofit
。如您所知,Retrofit
有 onResponse
和 onFailure
方法。
我想实现的是每当调用returns401错误时将用户注销。
第一个选项是每次我进行 API 调用时将它们注销,覆盖 onResponse
。我可以从 Response
对象调用 response.getRaw().code()
,如果是 401,则注销用户。但是,这不是一个好方法。
如果您对高层处理这种情况有任何建议,那就太好了。
谢谢
如前所述,一种方法是使用 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();
}
}
我有一个项目有用户登录系统。在我的项目中,我使用 Retrofit
。如您所知,Retrofit
有 onResponse
和 onFailure
方法。
我想实现的是每当调用returns401错误时将用户注销。
第一个选项是每次我进行 API 调用时将它们注销,覆盖 onResponse
。我可以从 Response
对象调用 response.getRaw().code()
,如果是 401,则注销用户。但是,这不是一个好方法。
如果您对高层处理这种情况有任何建议,那就太好了。
谢谢
如前所述,一种方法是使用 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();
}
}