8

Web アプリケーションで自動テストを行うプログラムを作成しようとしています。これを実現するために、HttpURLConnection を使用して接続を開きます。

テストしようとしているページの 1 つが 302 リダイレクトを実行します。私のテストコードは次のようになります:

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
connection.connect();
system.out.println(connection.getURL().toString());

urlToSend がhttp://www.foo.com/bar.jspで、このページが http://www.foo.com/quux.jsp にリダイレクトするとします。私の println ステートメントはhttp://www.foo.com/quux.jspを出力するはずですよね?

違う。

リダイレクトは発生せず、元の URL が出力されます。ただし、connection.getResponseCode() の呼び出しで connection.connect() 行を切り替えると、魔法のように機能します。

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());

この動作が見られるのはなぜですか? 私は何か間違ったことをしていますか?

助けてくれてありがとう。

4

5 に答える 5

19

このconnect()メソッドは、接続を作成するだけです。応答を返して処理するには、(、、または を呼び出して)getInputStream()要求getResponseCode()をコミットする必要があります。getResponseMessage()

于 2010-01-28T00:17:55.237 に答える
1

connect()メソッドはURLConnection クラスに実装されており、HttpURLConnectionクラスによってオーバーライドされません。

URLConnection クラスは HTTP を認識しないため、実際の接続を作成していたとしても、HTTP リダイレクトに従うべきではありません。

HTTP プロトコルに固有の動作が必要な場合は、getResponseCode() メソッドのように、HttpURLConnection クラスに実装されたメソッドに固執することをお勧めします。

于 2010-01-28T00:21:16.747 に答える
0

onCreate に以下を追加します

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2015-04-29T11:48:39.627 に答える
0

役立つかもしれないので、 setFollowRedirectsを試してください。実際にはgetFollowRedirects、最初にそれが問題であるかどうかを確認してください (デフォルトで true であるため、可能性は低いです)。

編集:これが問題でない場合は、接続から何かを読み取ろうとします(あなたと同じように、何かをgetResponseCode読み取るgetHeaderFieldとリダイレクトが尊重されるかどうかも確認します)。

于 2010-01-28T00:13:46.030 に答える
-1

Apache のHttpClientを使用しないのはなぜですか。

于 2010-01-28T00:10:54.460 に答える