使用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,所以我无法确定它为什么抛出。
答案 0 :(得分:0)
默认情况下,OkHttp应自动重定向并加载最终内容。请参阅OkHttpClient.Builder.followRedirects。
我自己的测试表明这是有效的,例如
$ 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
}