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

클라이언트가 구축되는 방식 외에 이전 예제와 다른 차이점은 없습니다.

전체 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));
}

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 프로젝트 에서 찾을 수 있습니다 .

HTTPClient footer