Я использую HttpClient 4.1.2
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpClient.execute(httpget);
Итак, как я могу получить значения cookie?
Я использую HttpClient 4.1.2
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpClient.execute(httpget);
Итак, как я могу получить значения cookie?
Обратите внимание: первая ссылка указывает на то, что использовалось для работы в 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.
Не уверен, почему принятый ответ описывает метод getCookieStore()
, который не существует. Это неверно.
Вы должны заранее создать хранилище cookie, а затем построить клиент, используя этот хранилище 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();
Еще один, чтобы заставить других людей начать, видя несуществующие методы, царапающие их головы...
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());
}
Это приведет к печати значений файлов cookie. Ответ сервера может иметь несколько полей заголовка Set-Cookie
, поэтому вам нужно получить массив Header
s
Как Мэтт 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]]
В соответствии с примером в начальном вопросе способ доступа к CookieStore
после выполнения HTTP-запроса заключается в использовании объекта состояния выполнения HttpContext
, который будет ссылаться на хранилище файлов cookie (новый, если CookieStore не указан в HttpClientBuilder или в новом CookieStore) после выполнения запроса.
HttpClientContext context = new HttpClientContext();
CloseableHttpResponse response = httpClient.execute(request, context);
CookieStore cookieStore = context.getCookieStore();
Это основано на httpcomponents-client: 4.3+, когда были введены ClosableHttpClient и InternalHttpClient.