1. Обзор
В этом кратком руководстве будет показано, как настроить Apache HttpClient для автоматического отслеживания перенаправлений для POST-запросов.
2. Перенаправление на HTTP POST
2.1. Для HttpClient 5.x
По умолчанию автоматически выполняются запросы GET и POST, приводящие к перенаправлению. Эта функциональность отличается от предыдущей версии (4.5.x), которую мы продемонстрируем в следующем разделе.
@Test
void givenRedirectingPOST_whenUsingDefaultRedirectStrategy_thenRedirected() throws IOException {
final HttpPost request = new HttpPost("http://t.co/I5YYd9tddw");
try (CloseableHttpClient httpClient = HttpClientBuilder.create()
.setRedirectStrategy(new DefaultRedirectStrategy())
.build()) {
httpClient.execute(request, response -> {
assertThat(response.getCode(), equalTo(200));
return response;
});
}
}
Обратите внимание, что при использовании DefaultRedirectStrategy и перенаправлении выполняется POST, что приводит к коду состояния 200 OK.
Даже если мы не используем новую DefaultRedirectStrategy(), перенаправление выполняется:
2.2. Для HttpClient 4.5
В HttpClient 4.5 по умолчанию автоматически выполняются только запросы GET, приводящие к перенаправлению. Если в ответ на запрос POST HTTP 301 перемещен навсегда или найден 302 – перенаправление автоматически не выполняется.
Это указано в HTTP RFC 2616:
- Если код состояния 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выдан запрос.
Конечно, есть варианты использования, когда нам нужно изменить это поведение и ослабить строгую спецификацию HTTP.
Сначала давайте проверим поведение по умолчанию:
@Test
public void givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected()
throws ClientProtocolException, IOException {
HttpClient instance = HttpClientBuilder.create().build();
HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}
Как вы можете видеть, по умолчанию перенаправление не выполняется, и мы возвращаем код состояния 301.
Давайте теперь посмотрим, как мы можем отслеживать перенаправления, установив стратегию перенаправления:
@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected()
throws ClientProtocolException, IOException {
HttpClient instance =
HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
С помощью LaxRedirectStrategy ограничения HTTP ослаблены, и перенаправление также выполняется через POST, что приводит к коду состояния 200 OK.
3. Заключение
В этом кратком руководстве показано, как настроить любую версию Apache HttpClient для отслеживания перенаправлений для HTTP POST–запросов, а также для ослабления строгого стандарта HTTP.
Оригинал статьи: https://www.baeldung.com/httpclient-redirect-on-http-post