在Android中使用Okhttp处理重定向

时间:2017-06-06 10:16:20

标签: android http redirect okhttp

我使用Okhttp从我的服务器下载了一些 http请求来下载JSON 。 对于我和我所有的阿尔法测试人员来说,一切都很好,但在野外我 当我尝试使用解析响应时遇到一些异常 GSON。

据我所知,异常发生,因为连接被重定向,在用户在机场或使用有限的情况下 酒店内的WIFI连接等。

例外:

Exception java.lang.IllegalStateException: closed
okhttp3.internal.http.Http1xStream$FixedLengthSource.read (Http1xStream.java:378)
okio.Buffer.writeAll (Buffer.java:956)
okio.RealBufferedSource.readByteArray (RealBufferedSource.java:92)
okhttp3.ResponseBody.bytes (ResponseBody.java:83)
okhttp3.ResponseBody.string (ResponseBody.java:109)
[xxxx].BackendFilter.handleResponse (BackendFilter.java:131)
[xxxx].BackendFilter.access$300 (BackendFilter.java:30)
[xxxx].BackendFilter$2.onResponse (BackendFilter.java:114)
okhttp3.RealCall$AsyncCall.execute (RealCall.java:133)
okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
java.lang.Thread.run (Thread.java:762)

从我在firebase中的日志中我可以看到响应的URL不同 到我以前在请求中设置的网址

即。我得到:http://www.tunisietelecom.tn/tt/themes/html/TT_Theme/infosolde.html

基本上说:

  

尊敬的客户,

     

您的计划已经用尽,继续从您的INTERNET中受益   优惠,通过手机拨打* 140#,或者拨打* 145#数据   关键包。

所以我假设这个特定用户被重定向,因为他的数据包 过期了。

响应代码仍为200 ,我的应用程序尝试解析 响应体,显然失败了。不是我的例外 预期,但无论如何它都失败了。 (任何人都可以向我解释,为什么这个例外 发生。而不是Gson JsonSyntaxException?)

我在stackoverflow上阅读了多篇文章并事先进行了谷歌搜索, 但任何人都可以告诉我如何处理这种重定向? 如果我(如何?),顺利解除此请求的最佳方法是什么? 识别重定向。

TL;博士

我现在的方法是首先通过设置OkHttpClient client = new OkHttpClient().newBuilder().followRedirects(false).followSslRedirects(false).build();来禁用重定向,但我不确定(并且熟悉此主题),如果有的话 重定向完全正常的情况,我想允许它们。

下一种方法,不禁用重定向就是调查 响应。如果方法response.isRedirect()返回true,那么 请求的网址(response.request.url())与之不同 我要求的网址,我会顺利驳回请求。 这些方法中有哪些适合?是否有更好的策略来处理 这些重定向?异常是否因为a而发生 重定向?

提前谢谢大家!

0 个答案:

没有答案