Как я могу получить куки от HttpClient? - PullRequest
36 голосов
/ 05 января 2012

Я использую HttpClient 4.1.2

HttpGet httpget = new HttpGet(uri); 
HttpResponse response = httpClient.execute(httpget);

Итак, как я могу получить значения cookie?

Ответы [ 5 ]

47 голосов
/ 10 марта 2015

Не уверен, почему принятый ответ описывает метод getCookieStore(), который не существует.Это неверно.

Необходимо заранее создать хранилище файлов cookie, а затем собрать клиент с использованием этого хранилища файлов cookie.Затем вы можете обратиться в этот магазин печенья, чтобы получить список файлов cookie.

/* init client */
HttpClient http = null;
CookieStore httpCookieStore = new BasicCookieStore();
HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCookieStore(httpCookieStore);
http = builder.build();

/* do stuff */
HttpGet httpRequest = new HttpGet("http://stackoverflow.com/");
HttpResponse httpResponse = null;
try {httpResponse = http.execute(httpRequest);} catch (Throwable error) {throw new RuntimeException(error);}

/* check cookies */
httpCookieStore.getCookies();
12 голосов
/ 27 декабря 2013

Еще один, чтобы начать других людей, видя, как несуществующие методы почесывают головы ...

import org.apache.http.Header;
import org.apache.http.HttpResponse;

Header[] headers = httpResponse.getHeaders("Set-Cookie");
for (Header h : headers) {
    System.out.println(h.getValue().toString());  
}

Это напечатает значения куки. Ответ сервера может иметь несколько полей заголовка Set-Cookie, поэтому вам нужно получить массив Header s

8 голосов
/ 05 января 2012

Обратите внимание: первая ссылка указывает на то, что раньше работало в HttpClient V3. Найдите информацию, связанную с V4 ниже.

Это должно ответить на ваш вопрос

http://www.java2s.com/Code/Java/Apache-Common/GetCookievalueandsetcookievalue.htm

Следующее относится к V4:

... кроме того, javadocs должен содержать больше информации об обработке файлов cookie

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/index.html

и вот учебник для httpclient v4:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

А вот псевдокод, который помогает (надеюсь, он основан только на документах):

HttpClient httpClient = new DefaultHttpClient();
// execute get/post/put or whatever
httpClient.doGetPostPutOrWhatever();
// get cookieStore
CookieStore cookieStore = httpClient.getCookieStore();
// get Cookies
List<Cookie> cookies = cookieStore.getCookies();
// process...

Пожалуйста, убедитесь, что вы прочитали javadocs для ResponseProcessCookies и AbstractHttpClient.

4 голосов
/ 06 октября 2017

Исходя из примера, приведенного в первоначальном вопросе, способ доступа к CookieStore после выполнения HTTP-запроса - с помощью объекта состояния выполнения HttpContext.

HttpContext будет ссылаться на cookiestore (новый, если в HttpClientBuilder не было указано CookieStore) после выполнения запроса.

HttpClientContext context = new HttpClientContext();
CloseableHttpResponse response = httpClient.execute(request, context);
CookieStore cookieStore = context.getCookieStore();

Это применяется к httpcomponents-client:4.3+, когда был введен ClosableHttpClient.

1 голос
/ 07 марта 2016

Как Matt Broekhuis ответил в комментарии к этот ответ выше , можно использовать DefaultHttpClient.getCookieStore()

Обратите внимание, что в то время, когда я отвечал, мой сервер был ограничен httpclient-4.2.5. DefaultHttpClient устарело с 4.3. Я собираюсь оставить этот ответ здесь, потому что другие могут оказаться в той же ситуации, и оригинальный постер указал, что они использовали 4.1.2.

import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.IOException;
import java.util.List;

public class So8733758 {

  public static void main(String... args) throws IOException {
    final HttpUriRequest request = new HttpGet("http://stackoverflow.com");
    final DefaultHttpClient http = new DefaultHttpClient();
    http.execute(request);
    final List<Cookie> cookies = http.getCookieStore().getCookies();
    System.out.println(cookies);
  }
}

который выводит

[[version: 0][name: __cfduid][value: de2dfa8314f565701cf7b3895206f04d81457380383][domain: .stackoverflow.com][path: /][expiry: Tue Mar 07 11:53:03 PST 2017], [version: 0][name: prov][value: eeee9738-c50b-44f6-a8aa-b54966db1a88][domain: .stackoverflow.com][path: /][expiry: Thu Dec 31 16:00:00 PST 2054]]
...