在Android中使用Okhttp处理重定向

Jac*_*1re 5 redirect android http okhttp

使用Okhttp发出了一些http请求,以从服务器下载JSON。对于我和我的所有Alpha测试人员来说,一切正常,但是在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

它基本上说:

尊敬的客户,

您的计划已用尽,要继续从INTERNET优惠中受益,请通过电话拨打* 140#(对于软件包)或* 145#(对于数据密钥)。

因此,我假设该特定用户已重定向,因为他的数据包已过期。

尽管如此,响应代码还是200,而我的应用程序尝试解析响应正文,这显然失败了。不像我期望的那样,但是无论如何它还是失败了。(有人可以向我解释为什么会发生这种例外情况,而不是Gson JsonSyntaxException吗?)

我阅读了关于stackoverflow的多篇文章,并事先做了Google搜索,但是有人可以告诉我如何处理这种重定向吗?如果我(如何?)认识到重定向,最好的方法是顺利解除此请求。

tl; dr

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

在不禁用重定向的情况下,下一个方法是调查响应。如果该方法response.isRedirect()返回true,并且请求(response.request.url())的网址与我请求的网址不同,则可以顺利地取消该请求。这些方法是否合适?是否有更好的策略来处理这类重定向?是否确实由于重定向而发生异常?

谢谢大家!