如何在Glide v4 / OkHttp3中检测重定向?

时间:2017-08-21 12:02:56

标签: android okhttp3 android-glide

使用Glide v4和OkHttp3,如何检测重定向并在其发生时加载其他URL?

我的用例:我使用带有OkHttp3的Glide v4库在我的应用程序中下载图片。有时当图片不可用时,服务器执行重定向以提供另一张图片而不是我原本想要的图片。我可以在我的浏览器中看到它,因为当我请求URL A时,我终于以第二张图片登陆了URL B.当发生这种情况时,我想改为加载源自url A的url C(所以不是静态url)。

目前我可以使用OkHttp3拦截器检测重定向:

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;
}

但后来我不知道如何干净地加载url C.我不知道如何在拦截器中加载另一个url,如果我抛出一个IOException以便稍后在Glide RequestListener中处理错误它只会导致GlideException,所以我无法确定它为什么抛出。

3 个答案:

答案 0 :(得分:0)

默认情况下,OkHttp应自动重定向并加载最终内容。请参阅OkHttpClient.Builder.followRedirects。

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

我自己的测试表明这是有效的,例如

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

为了检测它,我假设您的拦截器是通过addInterceptor而不是addNetworkInterceptor注册的。这是对的吗?

同样值得确保重定向是通过30倍响应而不是通过HTML刷新。

答案 1 :(得分:0)

我最终遇到的解决方案非常难看:我在问题中显示的请求拦截器在检测到重定向时引发IOException。然后我将使用GlideListener来检测错误,并加载url C.丑陋的部分是在GlideListener中我无法确定错误的原因,它可以是重定向但它也可以是网络错误或其他任何事情。

可以使用自定义的OkHttpUrlLoader实现此解决方案的更干净版本,但是我的简单用例代码太多了。

答案 2 :(得分:0)

这是我在Glide v4 / OkHttp3中的解决方案

String redirect = response.header("location");
if(redirect != null && !request.url().toString().equals(redirect)) {
    // if redirected your code here
}