ver squareup peticiones latest chrome interceptor retrofit okhttp

squareup - okhttp interceptor



Interceptar y reintentar la llamada a través de interceptores OkHttp (1)

Use .interceptors() lugar de .networkInterceptors() que pueden llamar a .proceed() más de una vez.

Para obtener más información, consulte: https://github.com/square/okhttp/wiki/Interceptors

Necesito volver a intentar la solicitud dentro de OkHttp Interceptor . Por ejemplo, hay una solicitud entrante que necesita el token de Authorization . Si el token de Authorization ha caducado, el servidor devuelve la respuesta con el código 403 . En este caso, estoy recuperando un nuevo token e intentando hacer una llamada nuevamente usando el mismo objeto de chain .

Pero OkHttp lanza una excepción, que indica que no puede realizar dos solicitudes con el mismo objeto de chain .

java.lang.IllegalStateException: network interceptor org.app.api.modules.ApplicationApiHeaders@559da2 must call proceed() exactly once

Me pregunto si hay una solución limpia para este problema de reintentar la solicitud de red dentro de OkHttp Interceptor .

Gracias

public final class ApplicationApiHeaders implements Interceptor { private static final String AUTHORIZATION = "Authorization"; private TokenProvider mProvider; public ApplicationApiHeaders(TokenProvider provider) { mProvider = provider; } @Override public Response intercept(Chain chain) throws IOException { Token token = mProvider.getApplicationToken(); String bearerToken = "Bearer " + token.getAccessToken(); System.out.println("Token: " + bearerToken); Request request = chain.request(); request = request.newBuilder() .addHeader(AUTHORIZATION, bearerToken) .build(); Response response = chain.proceed(request); if (!response.isSuccessful() && isForbidden(response.code())) { Token freshToken = mProvider.invalidateAppTokenAndGetNew(); String freshBearerToken = freshToken.getAccessToken(); Request newRequest = chain.request(); newRequest = newRequest.newBuilder() .addHeader(AUTHORIZATION, freshBearerToken) .build(); response = chain.proceed(newRequest); } return response; } private static boolean isForbidden(int code) { return code == HttpURLConnection.HTTP_FORBIDDEN; } }