6

LocationURLConnection を使用する場合、getHeaderFields() を使用しても 301 リダイレクトは機能せず、ヘッダーも表示されません。新しい Android を除いて、これは空白のリストです (私は 4.1 をテストし、動作しました)。これはデフォルトのブラウザでも報告されているようです、私のテストでは Android ブラウザで動作しました。古い Android でのこのバグの回避策はありますか?

私は試した:

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

ただし、新しい Android を除いて、空のリストを返します。

更新: 関連する問題である可能性があります。URLConnection がリクエストを送信していない場合もあるようです。(エミュレータを搭載したPCでWiresharkで確認しました)。このバグを回避する方法はありますか?

更新: 3xx リダイレクトをテストしてみました。リダイレクトは正常に機能しましたが、通常のリンクは Ian の Cookie Manager では機能しませんでした。setCookies が openConnection の直後に呼び出されたことを確認すると、うまく機能します。

        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エラーが発生します。これがおそらく、リダイレクトの実験的コードが 4.1 ではなく 2.2 で失敗した理由です。機能の違いの理由は何ですか? ここのコメントによると、リダイレクト 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 に答える