web-dev-qa-db-ja.com

Apache HTTPクライアントがリダイレクトを追跡しないようにする方法

Apache HTTPクライアントを使用してリモートサーバーに接続しています。リモートサーバーはリダイレクトを送信し、適切なヘッダーを抽出してターゲットで何でもできるように、クライアントがリダイレクトに従っていないことを実現したいです。

私はシンプルな作業コードサンプルを探しています(コピーペースト)挙動に続く自動リダイレクトを停止します

リダイレクト後のHttpClient 4の防止 が見つかりましたが、HttpClient 4.0(GA)で実装するにはあまりにも愚かです

41
Chris

デフォルトのHttpClient実装は設定可能性がかなり制限されていますが、HttpClientのブールパラメータhttp.protocol.handle-redirectsを使用してリダイレクト処理を制御できます。

参照用に docs を参照してください。

17
macbirdie

macbirdie のおかげで、魔法は次のとおりです。

params.setParameter("http.protocol.handle-redirects",false);

インポートは省略されています。コピーペーストのサンプルを次に示します。

HttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();

// HTTP parameters stores header etc.
HttpParams params = new BasicHttpParams();
params.setParameter("http.protocol.handle-redirects",false);

// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();

// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

// connect and receive 
HttpGet httpget = new HttpGet("http://localhost/web/redirect");
httpget.setParams(params);
response = httpclient.execute(httpget, localContext);

// obtain redirect target
Header locationHeader = response.getFirstHeader("location");
if (locationHeader != null) {
    redirectLocation = locationHeader.getValue();
  System.out.println("loaction: " + redirectLocation);
} else {
  // The response is invalid and did not provide the new location for
  // the resource.  Report an error or possibly handle the response
  // like a 404 Not Found error.
}
49
Chris

これは私のために働いた:

HttpGet httpGet = new HttpGet("www.google.com");
HttpParams params = httpGet.getParams();
params.setParameter(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE);
httpGet.setParams(params);
24
Caner

HttpClient 4.3およびFluentの使用:

final String url = "http://...";
final HttpClient client = HttpClientBuilder.create()
    .disableRedirectHandling()
    .build();
final Executor executor = Executor.newInstance(client);
final HttpResponse response = executor.execute(Request.Get(url))
    .returnResponse();
24

プロパティを直接使用する代わりに、次を使用できます。

final HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, false);
13
David Koski

HttpClient 4.3より前

旧バージョンのHttpクライアント(4.3以前)では、次のようにクライアントがリダイレクトで行うことを構成できます。

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient instance = new DefaultHttpClient();

    HttpParams params = new BasicHttpParams();
    params.setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    // HttpClientParams.setRedirecting(params, false); // alternative

    HttpGet httpGet = new HttpGet("http:/testabc.com");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

実際の生のhttp.protocol.handle-redirectsパラメーターを設定せずにリダイレクト動作を構成するために使用できる代替APIに注意してください:

HttpClientParams.setRedirecting(params, false);

また、フォローリダイレクトを無効にすると、Http Responseステータスコードが実際に301 Moved Permanentlyになっていることを確認できるようになりました。

HttpClient 4.3以降

HttpClient 4.3では、クライアントを構築および構成するためのよりクリーンなより高レベルのAPIが導入されました。

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
    HttpResponse response = instance.execute(new HttpGet("http://testabc.com"));

    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

新しいAPIは、個々のリクエストだけでなく、このリダイレクト動作でクライアント全体を設定することに注意してください。参照: http://www.baeldung.com/httpclient-stop-follow-redirect

1
Fan Jin
GetMethod method = new GetMethod(url);
method.setFollowRedirects(false); 
1
user769733

自動リダイレクトヘッダーを回避するには、最初に自動リダイレクトを行わないように要求を構成する必要があります。これを行うには、HttPClientParams.setRedirectionを呼び出してfalseに設定します。コードスニペットを以下に示します。

HttpPost postURL = new HttpPost(resourceURL);
...
HttpClientParams.setRedirecting(postURL.getParams(), false);
1
Simple-Solution

httpClientBuilderを直接呼び出す代わりに、次を使用できます。

HttpClients.custom().disableRedirectHandling().build();
0
liuck8080

これは私のために働いたCloseableHttpClient client = HttpClientBuilder.create()。disableRedirectHandling()。build();

0
Pravin

HttURLConnectionの場合、APIを公開しています。そのため、自動リダイレクトを検出すると、200ではなく302応答コードが返されます。応答コードを追跡することで、リダイレクトURLかどうかを簡単に追跡できます。

HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL("http://www.redirecturl.com").openConnection());
httpURLConnection.setInstanceFollowRedirects(false);
httpURLConnection.connect();
int responseCode = httpURLConnection.getResponseCode(); //302 in case of redirection.
0
Neo