Uso Retrofit e Dagger 2. Ho implementato un OkHttp Interceptor
per aggiungere il token oauth. Nel caso in cui non vi sia alcun token oauth o il timestamp non è valido, richiedo uno nuovo (tramite il servizio Retrofit) prima che venga eseguita la richiesta effettiva.OkHttp Interceptor che utilizza OkHttpClient senza ciclo di dipendenza
Questo crea un ciclo di dipendenze in cui il servizio Retrofit richiede il Interceptor
ma il Interceptor
richiede anche il servizio Retrofit (per il recupero del token oauth).
Esempio per il Interceptor
(per semplificazione, richiede sempre il token via 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());
}
approccio interessante. C'è un rovescio della medaglia (ad es .: prestazioni) perché ogni richiesta/intercetta causa un'iniezione? Anche l'Applicazione deve esporre il NetworkComponent, che a me sembra un po 'strano. – Maradox
Dagger 2 è costruito per essere veloce perché usa solo il codice generato, quindi essenzialmente chiamerà un metodo che imposta il 'RestService'. Ho aggiunto un modo alternativo che evita di iniettare l'intera classe alla mia risposta. Non deve essere 'Application' che lo fornisce, ma cos'altro fornirebbe i componenti' Singleton' della tua app? Memorizzare i componenti dell'intera applicazione in Applicazione è una pratica comune su tutte le cose di Dagger 2 che ho letto. –