2015-01-29 2 views
4

Я пытаюсь автоматически обновить 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; 
     } 
    } 
} 
+0

Не могли бы вы включить код вашего перехватчика? – nhaarman

+0

@NiekHaarman Сделано. – theblang

+1

Ваш Заголовок авторизации кажется мне дублированным в заголовках запроса. Это может произойти, потому что когда вы вызываете .newBuilder() существующие заголовки копируются в новый экземпляр строителя. Как насчет того, чтобы попытаться создать запрос с нуля? Скопируйте все, кроме заголовков, из предыдущего сеанса. –

ответ

1

У меня была эта проблема - если вы получаете код HTTP-ответа, который будет вызывать дооснащения вызвать сбой() вместо успеха() исключение будет выброшено.

Если вы заключаете

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

в Try/поймать (RetrofitError е) вы будете в состоянии выполнить код после сбоя, однако я обнаружил, что это довольно громоздким, и я до сих пор в процесс поиска лучшего решения.

Смежные вопросы