从OkHttp拦截器内部进行同步Retrofit调用

时间:2015-01-29 23:39:49

标签: android interceptor retrofit okhttp

如果过期,我会尝试自动刷新auth token。我正在使用Interceptor中引入的新OkHttp 2.2类。在intercept方法中,我使用chain.proceed(request)尝试原始请求,检查响应代码,如果令牌过期,我将同步调用单独的Retrofit服务以获取新令牌。

奇怪的是,没有代码通过同步调用似乎运行。如果我尝试使用同步调用行中的断点进行调试,然后执行一个步骤,我将在Dispatcher.java中停止:

if (!executedCalls.remove(call)) throw new AssertionError("Call wasn't in-flight!");

知道我在这里做错了什么吗?我可能只是手工制作一个新请求,但我很好奇为什么Retrofit call似乎无法在这里工作。

我的拦截器

public class ReAuthInterceptor implements Interceptor {

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

        // try the request
        Response response = chain.proceed(request);

        // if we receive a "401 - Not Authorized" then refresh the auth token and try again
        if (response.code() == 401) {
            // get a new auth token and store it
            UserToken userToken = MobileClient.getOkraService().login(AuthUtil.getUserToken(MSWorksApplication.getContext()));
            AuthUtil.authenticate(MSWorksApplication.getContext(), userToken);

            Log.d("TEST", "TEST TEST TEST");

            // use the original request with the new auth token
            Request newRequest = request.newBuilder().header("Authorization", AuthUtil.getAuthToken(MSWorksApplication.getContext())).build();

            return chain.proceed(newRequest);
        }
        else {
            // the auth token is still good
            return response;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题 - 如果您获得的HTTP响应代码会导致Retrofit调用失败()而不是成功(),则会抛出异常。

如果你换行

UserToken userToken = MobileClient.getOkraService().login(AuthUtil.getUserToken(MSWorksApplication.getContext()));

在try / catch(RetrofitError e)中,您将能够在失败后执行代码,但是我发现这非常麻烦并且仍在寻找更好的解决方案。