首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用重试时重试机制的最佳实践是什么?

使用重试时重试机制的最佳实践是什么?
EN

Stack Overflow用户
提问于 2018-04-03 10:25:30
回答 2查看 3.5K关注 0票数 0

问题陈述:

在我的API调用应用程序中,我使用Retrofit。目前我有20+重装接口,与不同的Callbacks。目前,当应用程序在这些接口(如UpdateUserAPI)中接收到UpdateUserAPI时,我必须通过调用AccessTokenAPI来获得新的ACCESS_TOKEN

建议的方法:

当应用程序在INVALID_SESSION_ID中接收到Callback in UpdateUserAPI时,调用AccessTokenAPI获得新的ACCESS_TOKEN。在接收到新的ACCESS_TOKEN后,使用新的ACCESS_TOKEN发布实际调用(带有UpdateUserAPI中的初始参数)。但是这需要在实现UpdateUserAPI的类中保存参数。另外,我需要重新尝试只获得一次ACCESS_TOKEN,这应该被处理。

实现上述需求的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-03 10:55:11

创建自己的TokenInterceptor

代码语言:javascript
复制
public class TokenInterceptor implements Interceptor 

然后将其设置为您的okktpclient。

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2018-10-30 12:17:23

创建您自己的自定义拦截器,并检查令牌/会话_id是否有效。如果您的session_id过期,然后按下您的updateUserAPI以获得新的id,并在标头中或在您想要的位置设置这个id。这是一些代码样本。

RefreshTokenInterceptor

代码语言:javascript
复制
    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

代码语言:javascript
复制
 OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(50, TimeUnit.SECONDS)
                    .writeTimeout(55, TimeUnit.SECONDS)
                    .connectTimeout(50, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                   .addInterceptor(new NetworkInterceptor())
                    .build();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49627726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档