使用Retrofit时重试机制的最佳做法是什么?

时间:2018-04-03 10:25:31

标签: java android retrofit okhttp3

问题陈述:

我在我的应用程序中使用Retrofit进行API调用。目前,我有20多个改造接口,具有不同的Callbacks。目前,当应用在其中任何一个接口(例如INVALID_SESSION_ID)中收到UpdateUserAPI时,我通过调用ACCESS_TOKEN来获取新的AccessTokenAPI

接近建议:

当应用在INVALID_SESSION_ID的{​​{1}}中收到Callback时,请调用UpdateUserAPI以获取新的AccessTokenAPI。收到新的ACCESS_TOKEN后,请使用新ACCESS_TOKEN发布实际通话(包含UpdateUserAPI中的初始参数)。但这需要在实现ACCESS_TOKEN的类中保存参数。此外,我只需要重试UpdateUserAPI一次,这应该处理。

实施上述要求的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

创建您自己的TokenInterceptor

public class TokenInterceptor implements Interceptor 

然后将其设置为okktpclient

Interceptor tokenInterceptor = new TokenInterceptor(provideUserLoginDao(appDatabase));
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(tokenInterceptor)
                .writeTimeout(50, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

此帖中的有用信息还包括:Refreshing OAuth token using Retrofit without modifying all calls

答案 1 :(得分:0)

创建您自己的自定义拦截器,并检查您的令牌/ session_id是否有效。如果您的session_id已过期,然后点击您的updateUserAPI以获取新的ID,并在标题或所需位置设置此ID。这是一些代码示例。

RefreshTokenInterceptor

    public static class RInterceptor implements Interceptor {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        try {
            if (response.code() == 410) {

                Response r = null;
                try {

                    r = makeTokenRefreshCall(request, chain);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return r;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return response;
    }
}


  private static Response makeTokenRefreshCall(Request req, Interceptor.Chain chain) throws JSONException, IOException {
    /* fetch refreshed token, some synchronous API call, whatever Because we are responsible to return new response  */
    refreshTokenSync();
    Request newRequest;
    newRequest = req.newBuilder().header("authorization", NEW_TOKEN)/*.post(req.body())*/.build();
    return chain.proceed(newRequest);


}

RESTClient

 OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(50, TimeUnit.SECONDS)
                    .writeTimeout(55, TimeUnit.SECONDS)
                    .connectTimeout(50, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                   .addInterceptor(new NetworkInterceptor())
                    .build();