Рубрики
Без рубрики

HttpClient 4 – Следуйте Перенаправления для POST

Как включить POST Перенаправить с Apache HttpClient.

Автор оригинала: Eugen Paraschiv.

1. Обзор

Этот быстрый учебник покажет, как настроить Apache HttpClient 4, чтобы автоматически следовать перенаправлениям для запросов POST.

Если вы хотите копать глубже и узнать другие интересные вещи, которые вы можете сделать с HttpClient – над головой, чтобы основной httpClient учебник .

По умолчанию автоматически следуют только запросы GET, приводящие к перенаправлению. Если запросы POST отвечают либо HTTP 301 переехал постоянно или с 302 Найденоперенаправление не следует автоматически .

Об этом сообщает HTTP RFC 2616 :

Если код статуса 301 получен в ответ на запрос, кроме GET или HEAD, агент пользователя не должен автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, так как это может изменить условия, при которых был выдан запрос.

Есть, конечно, usecases, где мы должны изменить это поведение и расслабиться строгой спецификации 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 Статус-код .

2. Перенаправление на HTTP POST

2.1. Для HttpClient 4.3 и после

В HttpClient 4.3 был введен API более высокого уровня как для создания, так и для конфигурации клиента:

@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));
}

Обратите HttpClientBuilder в настоящее время является отправной точкой свободного API что позволяет полную конфигурацию клиента в более читаемым способом, чем раньше.

2.2. для httpClient 4.2

В предыдущей версии HttpClient (4.2) мы можем настроить стратегию перенаправления непосредственно на клиента:

@SuppressWarnings("deprecation")
@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    client.setRedirectStrategy(new LaxRedirectStrategy());

    HttpResponse response = client.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

Обратите внимание, что теперь, с новой ЛаксРедиректорстратегия , Ограничения HTTP смягчены и перенаправление следует за POST, а – приводит к 200 ОК статус-код.

2.3. Pre HttpClient 4.2

Перед HttpClient 4.2, ЛаксРедиректорстратегия класса не существовало, поэтому мы должны свернуть наши собственные:

@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    client.setRedirectStrategy(new DefaultRedirectStrategy() {
        /** Redirectable methods. */
        private String[] REDIRECT_METHODS = new String[] { 
            HttpGet.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME 
        };

        @Override
        protected boolean isRedirectable(String method) {
            for (String m : REDIRECT_METHODS) {
                if (m.equalsIgnoreCase(method)) {
                    return true;
                }
            }
            return false;
        }
    });

    HttpResponse response = client.execute(new HttpPost("http://t.co/I5YYd9tddw"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}

3. Заключение

Это краткое руководство проиллюстрировало, как настроить любую версию Apache HttpClient 4, чтобы следовать перенаправлениям для запросов HTTP POST, а также – ослабление строгого стандарта HTTP.

Реализация всех этих примеров и фрагментов кода можно найти в мой github проект – это проект на основе Eclipse, поэтому он должен быть легким для импорта и запуска, как она есть.