Я пытаюсь автоматически обновить auth token
, если он истек. Я использую новый класс Interceptor
, который был введен в OkHttp 2.2
. В методе intercept
я пытаюсь выполнить первоначальный запрос с chain.proceed(request)
, проверяя код ответа, и если токен истек, я синхронно звоню в отдельную службу Retrofit, чтобы получить новый токен.Сделать синхронный вызов для переоснащения изнутри перехватчика OkHttp
Странная вещь: никакой код, предшествующий синхронному вызову, не работает. Если я пытаюсь отладки с точки останова на линии синхронного вызова, а затем сделать шаг-более, я остановился в 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;
}
}
}
Не могли бы вы включить код вашего перехватчика? – nhaarman
@NiekHaarman Сделано. – theblang
Ваш Заголовок авторизации кажется мне дублированным в заголовках запроса. Это может произойти, потому что когда вы вызываете .newBuilder() существующие заголовки копируются в новый экземпляр строителя. Как насчет того, чтобы попытаться создать запрос с нуля? Скопируйте все, кроме заголовков, из предыдущего сеанса. –