使用v4和OkHttp3,当重定向发生时,如何检测重定向并加载另一个url?
我的应用程序:我使用带OkHttp3的幻灯片OkHttp3库在我的应用程序中下载图片。有时,当图片不可用时,服务器将执行重定向,以提供另一张图片,而不是我原来想要的图片。我可以在浏览器中看到它,因为当我请求url时,我终于在url上找到了第二张图片。当发生这种情况时,我想要加载从url派生的url (所以不是静态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。我不知道如何在拦截器中加载另一个url,如果我抛出IOException来处理稍后在RequestListener中出现的错误,它只会导致一个GlideException,所以我无法确定为什么会抛出它。
发布于 2017-09-06 01:10:18
我最终得到的解决方案非常难看:当检测到重定向时,我在问题中显示的请求拦截器会引发一个IOException。然后我将使用GlideListener来检测错误,并加载url C。丑陋的部分是,在GlideListener中,我无法确定错误的原因,它可以是重定向,但也可以是网络错误或任何其他错误。
这个解决方案的一个更干净的版本可能可以通过自定义OkHttpUrlLoader来实现,但是对于我的简单用法来说,它的代码太多了。
发布于 2017-08-23 21:52:09
默认情况下,OkHttp应该自动重定向并加载最终内容。见OkHttpClient.Builder.followRedirects。
我自己的测试表明,这是可行的。
$ oksocial 'https://httpbin.org/redirect-to?url=https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg'
为了检测它,我假设您的拦截器是通过addInterceptor而不是addNetworkInterceptor注册的。对吗?
还值得确保重定向是通过30X响应,而不是通过HTML刷新。
发布于 2018-12-15 00:57:15
这是我在幻灯片v4 / OkHttp3中的解决方案
String redirect = response.header("location");
if(redirect != null && !request.url().toString().equals(redirect)) {
// if redirected your code here
}
https://stackoverflow.com/questions/45796630
复制