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

HTTPClient footer