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 기반 프로젝트이므로 그대로 가져오고 실행하기 쉬워야 합니다.