J'utilise Retrofit et Dagger 2. J'ai implémenté un OkHttp Interceptor
pour ajouter le jeton oauth. Dans le cas où il n'y a pas de jeton oauth ou si l'horodatage est invalide, j'en demande un nouveau (via le service Retrofit) avant que la demande réelle ne soit effectuée.OkHttp Interceptor utilisant OkHttpClient sans cycle de dépendance
Ceci crée un cycle de dépendances où le service Retrofit nécessite le Interceptor
mais le Interceptor
nécessite également le service Retrofit (pour récupérer le jeton oauth).
Exemple pour le Interceptor
(pour simplifier, il demande toujours le jeton 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());
}
Approche intéressante. Y a-t-il un inconvénient (par exemple: performance) parce que chaque requête/interception provoque une injection? Aussi l'application doit exposer le NetworkComponent, ce qui me semble un peu étrange. – Maradox
Dagger 2 est conçu pour être rapide car il utilise uniquement du code généré, donc il va essentiellement appeler une méthode qui définit votre 'RestService'. J'ai ajouté un moyen alternatif qui évite d'injecter toute la classe à ma réponse. Il ne doit pas être 'Application' le fournissant, mais quoi d'autre fournirait les composants de votre application' Singleton'? Le stockage de vos composants à l'échelle de l'application dans Application est une pratique courante sur tous les éléments de Dagger 2 que j'ai lus. –