如果过期,我会尝试自动刷新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;
}
}
}
答案 0 :(得分:1)
我遇到了这个问题 - 如果您获得的HTTP响应代码会导致Retrofit调用失败()而不是成功(),则会抛出异常。
如果你换行
UserToken userToken = MobileClient.getOkraService().login(AuthUtil.getUserToken(MSWorksApplication.getContext()));
在try / catch(RetrofitError e)中,您将能够在失败后执行代码,但是我发现这非常麻烦并且仍在寻找更好的解决方案。