6

使用 URLConnection 时,301 重定向不起作用,甚至不显示Location标题,使用 getHeaderFields()。这是一个空白列表,除了在较新的 Android 中(我测试了 4.1 并且它有效)。虽然在我的测试中它在 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 上失败的原因。功能差异的任何原因?根据这里的评论,重定向 https 显然有不同的行为,具体取决于 JVM 版本,是不是 Android 的 URLConnection/HTTPUrlConnection 在不同的版本中也发生了变化?

4

1 回答 1

2

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

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

(基于apache commons HttpClient)

于 2012-10-13T05:58:04.097 回答