1. 개요
이 사용방법(예제) 에서는 Apache HttpClient를 사용하여 사용자 지정 쿠키를 보내는 방법에 중점을 둘 것입니다 .
더 깊이 파고들고 HttpClient로 할 수 있는 다른 멋진 것들을 배우고 싶다면 메인 HttpClient 예제 로 넘어가 십시오 .
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 프로젝트 에서 찾을 수 있습니다 .