301/302重定向无法在Android中运行(在不同版本中的工作方式不同)

时间:2012-10-13 05:53:05

标签: java android redirect http-status-code-301 urlconnection

使用URLConnection时,301重定向不起作用,甚至不使用getHeaderFields()显示Location标头。它是一个空白列表,除了较新的Android(我测试4.1并且它工作)。它看起来像是在默认浏览器here中报告的内容,尽管在我的测试中它在Android浏览器中有效。在旧的Android中是否有针对此错误的解决方法?

我试过了:

URLConnection conn = u.openConnection();
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
(conn).setInstanceFollowRedirects(true);

但它仍会返回一个空列表,除了较新的Android。

更新:这可能是一个相关的问题,有时似乎URLConnection甚至没有在某些情况下发送请求。 (我在带有模拟器的电脑上查看了Wireshark)。有没有办法解决这个错误?

更新:我尝试测试3xx重定向,重定向工作正常,但普通链接无法与Ian的Cookie管理器一起使用。确保在openConnection之后直接调用setCookies时,它运行得很好:

        URL u = new URL(_url);
        ...
        int tries = 4;
        int code = 301;
        URLConnection conn = null;
        while (tries > 0 && code/100 == 3) {
            conn = null;
            conn = u.openConnection();
            _CM.setCookies(conn);
            ((HttpURLConnection)conn).setInstanceFollowRedirects(false);//Required
            code =((HttpURLConnection)conn).getResponseCode();
            if (code/100 == 3) {
                String loc = conn.getHeaderField("Location");
                u = new URL(loc);
            }
        }

        //conn.addRequestProperty("Accept-Encoding", "gzip");

        conn.connect();
        _CM.storeCookies(conn);

真正奇怪的是,对于较新的Android(4.1模拟器),FollowRedirect行(注释为“必需”)不是必需的。在较旧的Android(2.2)上,它会出现Connection Reset by Peer错误。这可能是我的重定向实验代码在2.2而不是4.1上失败的原因。功能上有什么不同的原因?根据{{​​3}},重定向https显然具有不同的行为,具体取决于JVM版本,可能是Android的URLConnection / HTTPUrlConnection在不同版本中也发生了变化吗?

1 个答案:

答案 0 :(得分:2)

不确定URLConnection,但我知道HttpClient尊重重定向,我们一直使用它回到Android 2.1

http://developer.android.com/reference/org/apache/http/client/HttpClient.html

(基于apache commons HttpClient)