1. 개요
이 예제은 Apache HttpClient 4를 사용하여 사용자 지정 쿠키를 보내는 방법에 중점을 둘 것 입니다.
이상에게 머리 - 당신은 깊이 파고와 다른 멋진의 당신이 HttpClient를 함께 할 수있는 일을 배우고 싶다면 주요 HttpCl ient 예제 .
2. HttpClient에서 쿠키 관리 구성
2.1. 4.3 이후의 HttpClient
최신 HttpClient 4.3에서는 클라이언트 구성 및 구성을 모두 담당하는 유창한 빌더 API를 활용합니다.
먼저 쿠키 저장소를 만들고 저장소에 샘플 쿠키를 설정해야 합니다.
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
그런 다음 setDefaultCookieStore() 메서드를 사용하여 HttpClient에 이 쿠키 저장소를 설정 하고 요청을 보낼 수 있습니다.
@Test
public void whenSettingCookiesOnTheHttpClient_thenCookieSentCorrectly()
throws ClientProtocolException, IOException {
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();
final HttpGet request = new HttpGet("http://www.github.com");
response = client.execute(request);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
매우 중요한 요소가되는 도메인은 쿠키에 설정되는 - 적절한 도메인을 설정하지 않고, 클라이언트가 쿠키를 전송하지 않습니다 전혀!
또한 사용하는 정확한 버전에 따라 다음을 설정해야 할 수도 있습니다.
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
2.2. 4.3 이전의 HttpClient
이전 버전의 HttpClient(4.3 이전)에서는 쿠키 저장소가 HttpClient 에서 직접 설정되었습니다 .
@Test
public void givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect()
throws ClientProtocolException, IOException {
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
DefaultHttpClient client = new DefaultHttpClient();
client.setCookieStore(cookieStore);
HttpGet request = new HttpGet("http://www.github.com");
response = client.execute(request);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
클라이언트가 빌드되는 방식 외에는 이전 예제와 다른 차이점이 없습니다.
3. 요청에 대한 쿠키 설정
전체 HttpClient에 쿠키를 설정하는 것이 옵션이 아닌 경우 HttpContext 클래스를 사용하여 쿠키로 요청을 개별적으로 구성할 수 있습니다 .
@Test
public void whenSettingCookiesOnTheRequest_thenCookieSentCorrectly()
throws ClientProtocolException, IOException {
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
instance = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://www.github.com");
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
// localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // before 4.3
response = instance.execute(request, localContext);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
4. 하위 수준 요청에 쿠키 설정
HTTP 요청에서 쿠키를 설정하는 저수준 대안은 쿠키를 원시 헤더로 설정하는 것입니다.
@Test
public void whenSettingCookiesOnARequest_thenCorrect()
throws ClientProtocolException, IOException {
instance = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://www.github.com");
request.setHeader("Cookie", "JSESSIONID=1234");
response = instance.execute(request);
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
이것은 물론 기본 제공 쿠키 지원으로 작업하는 것보다 훨씬 더 오류가 발생하기 쉽습니다 . 예를 들어, 이 경우 더 이상 도메인을 설정하지 않는다는 점에 유의하십시오. 이는 올바르지 않습니다.
5. 결론
이 기사에서는 HttpClient를 사용하여 사용자 정의된 사용자 제어 Cookie를 보내는 방법을 설명했습니다 .
이것은 HttpClient가 서버에서 설정한 쿠키를 처리하도록 하는 것과는 다릅니다. 대신 낮은 수준에서 수동으로 클라이언트 측을 제어합니다.
이 모든 예제와 코드 스니펫의 구현은 내 github 프로젝트 에서 찾을 수 있습니다 .