web-dev-qa-db-ja.com

HttpClientからCookieを取得するにはどうすればよいですか?

HttpClient 4.1.2を使用しています

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

それでは、どうすればクッキーの値を取得できますか?

36
coffee

注:最初のリンクは、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...

ResponseProcessCookiesおよびAbstractHttpClientのjavadocsを必ずお読みください。

8
mkro

受け入れられた答えが存在しないメソッド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();
47
Alex

他の人を開始するためのさらに別の方法は、存在しないメソッドが頭をかきむしるのを見る...

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ヘッダーフィールド。したがって、Headersの配列を取得する必要があります。

12
Kovács Imre

最初の質問の例に基づいて、HTTP要求の実行後にCookieStoreにアクセスする方法は、HttpContext実行状態オブジェクトを使用することです。

HttpContextは、リクエストの実行後にCookieストアを参照します(HttpClientBuilderでCookieStoreが指定されていない場合は新しい)。

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

これはhttpcomponents-client:4.3+ClosableHttpClientが導入されたとき。

4

Matt Broekhuis のコメントで回答された 上記のこの回答 の場合、DefaultHttpClient.getCookieStore()を使用できます

サーバーに回答した時点では、httpclient-4.2.5DefaultHttpClientは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]]
1
Kirby