2017-08-21 2 views
0

En utilisant Glide v4 et OkHttp3, comment puis-je détecter une redirection et charger une autre URL quand cela arrive?Comment détecter une redirection dans Glide v4/OkHttp3?

Mon utilisation: J'utilise la bibliothèque Glide v4 avec OkHttp3 pour télécharger des images dans mon application. Parfois, quand une image n'est pas disponible, une redirection est effectuée par le serveur pour fournir une autre image au lieu de celle que je voulais initialement. Je peux le voir dans mon navigateur car quand je demande l'url A, j'atterris finalement sur l'URL B avec la deuxième image. Quand cela arrive, je veux plutôt charger l'URL C qui est dérivée de l'url A (donc pas une URL statique).

En ce moment je peux détecter la redirection en utilisant un OkHttp3 Interceptor:

public Response intercept(@NonNull Chain chain) throws IOException { 
    String requestUrl = chain.request().url().toString(); 
    Response response = chain.proceed(chain.request()); 
    String responseUrl = response.request().url().toString(); 

    boolean redirect = !requestUrl.equals(responseUrl); 
    if (redirect) { 
     Timber.d("Detected redirection"); 
    } 

    return response; 
} 

mais je ne vois pas savoir comment charger proprement C. URL Je ne peux pas comment je charger une autre URL l'intercepteur, et si je lance une exception IOException pour gérer l'erreur plus tard dans un Glide RequestListener, cela entraînera une exception GlideException, donc je ne peux pas déterminer pourquoi il a été lancé.

Répondre

0

La solution à laquelle j'ai abouti est plutôt moche: l'intercepteur de requêtes que j'ai montré dans la question déclenche une exception d'E/S lorsqu'une redirection est détectée. Je vais ensuite utiliser un GlideListener pour détecter l'erreur, et charger l'URL C. La partie laide est que dans le GlideListener je ne peux pas déterminer la cause de l'erreur, il peut s'agir d'une redirection mais il peut aussi s'agir d'une erreur réseau ou rien d'autre.

Une version plus propre de cette solution peut probablement être réalisée avec un chargeur OkHttpUrl personnalisé, mais c'est trop de code pour mon utilisation simple.

0

OkHttp devrait être rediriger automatiquement par défaut et charger le contenu final. Voir OkHttpClient.Builder.followRedirects.

https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#followRedirects-boolean-

mes propres tests suggèrent que cela fonctionne, par exemple

$ oksocial 'https://httpbin.org/redirect-to?url=https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg' 

Pour le détecter, je suppose que votre intercepteur est enregistré via addInterceptor au lieu de addNetworkInterceptor. Est-ce exact?

Il est également important de s'assurer que la redirection s'effectue via une réponse 30X et non via un rafraîchissement HTML.