1. 개요

이 빠른 사용방법(예제)에서는 POST 요청에 대한 리디렉션을 자동으로 따르도록 Apache HttpClient를 구성하는 방법을 보여줍니다.

더 깊이 파고들고 HttpClient로 할 수 있는 다른 멋진 것들을 배우고 싶다면 메인 HttpClient 예제 로 넘어가십시오 .

기본적으로 리디렉션을 초래하는 GET 요청만 자동으로 따릅니다. POST 요청이 HTTP 301 Moved Permanently 또는 302 Found응답 되면 리디렉션이 자동으로 수행되지 않습니다 .

이는 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 상태 코드 를 반환합니다 .

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. Http클라이언트 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));
}

이제 새로운 LaxRedirectStrategy 를 사용하면 HTTP 제한이 완화되고 리디렉션도 POST를 통해 이어져 200 OK 상태 코드로 이어집니다.

2.3. HttpClient 4.2 이전

HttpClient 4.2 이전에는 LaxRedirectStrategy 클래스가 존재하지 않았으므로 자체적으로 롤링해야 합니다.

@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. 결론

이 빠른 사용방법(예제)는 HTTP POST 요청에 대한 리디렉션도 따르도록 Apache HttpClient의 모든 버전을 구성하여 엄격한 HTTP 표준을 완화하는 방법을 설명했습니다.

이 모든 예제와 코드 스니펫의 구현은 내 github 프로젝트 에서 찾을 수 있습니다. 이것은 Eclipse 기반 프로젝트이므로 그대로 가져오고 실행하기 쉬워야 합니다.

HTTPClient footer