Location
URLConnection を使用する場合、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 も異なるバージョンで変更されている可能性がありますか?