OkHttp Interceptor utilizando OkHttpClient sin ciclo de dependencia

Estoy utilizando Retrofit y Dagger 2. He implementado un Interceptor OkHttp para agregar el token oauth. En el caso de que no haya ningún token oauth o que la marca de tiempo no sea válida, solicito una nueva (a través del servicio Retrofit) antes de que se realice la solicitud real.

Esto crea un ciclo de dependencia donde el servicio de Retrofit requiere el Interceptor pero el Interceptor también requiere el servicio de Retrofit (para recuperar el token oauth).

Ejemplo para el Interceptor (para la simplificación siempre solicita el token mediante restService#refreshAccessToken ):

 @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request.Builder requestBuilder = originalRequest.newBuilder(); String authHeader = "Bearer " + restService.refreshAccessToken(); requestBuilder.addHeader("Authorization", authHeader); return chain.proceed(requestBuilder.build()); } 

Su Interceptor tendrá que inyectarse en el método Interceptor#intercept() . De esta manera, su servicio de Retrofit (incluida la OkHttpClient con el interceptor añadido) se puede satisfacer sin un ciclo de dependencia.

Mi NetworkComponent (que proporciona mi servicio de Retrofit) vive en mi clase de Application . A continuación se muestra un ejemplo de cómo inyectarlo utilizando un Context aplicación.

 public class AuthInterceptor implements Interceptor { @Inject RestService restService; public AuthInterceptor(Context context) { mContext = context; } @Override public Response intercept(Chain chain) throws IOException { // Inject Retrofit service ((MyApplication) context.getApplicationContext()) .getNetworkComponent().inject(this); Request originalRequest = chain.request(); Request.Builder requestBuilder = originalRequest.newBuilder(); String authHeader = "Bearer " + restService.refreshAccessToken(); requestBuilder.addHeader("Authorization", authHeader); return chain.proceed(requestBuilder.build()); } } 

También puede establecer una variable local sin inyectar la clase entera, posiblemente obteniendo un mejor rendimiento.

 RestService restService = InjectHelper.getNetworkComponent(mContext).restService(); 
  • Conseguir Dagger para inyectar objetos simulados al hacer pruebas funcionales espresso para Android
  • @Named proveedores con los mismos tipos de retorno terminan dando java.lang.IllegalArgumentException: Duplicar
  • Dagger 2 en Android: inyectar la misma dependencia en Activity y retener Fragment
  • Cómo migrar la inyección que falta del módulo con complete = false de Dagger 1 a Dagger 2
  • Aplicación para Android con RoboGuice 2.0 - Cómo inyectar un singleton con el contexto de la aplicación
  • Dagger apoya la inyección de dependencia para las pruebas de ActivityInstrumentationTestCase2
  • Android Dagger actualiza los valores fuera del módulo
  • Ejemplos de patrones de diseño de Android MVVM
  • Roboguice y simulacros: ¿Cómo roboguice inyectar un servicio de simulacro cuando la prueba, pero utiliza el REAL de lo contrario?
  • InjectView en RoboFragment
  • ¿Cómo inyectar la dependencia al fragmento androide anidado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.