2012-01-04 23 views

Trả lời

10

Xin lưu ý: Liên kết đầu tiên trỏ đến thứ được sử dụng để hoạt động trong HttpClient V3. Tìm thông tin liên quan đến V4 bên dưới.

này nên trả lời câu hỏi của bạn

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

Sau đây là phù hợp cho V4:

... ngoài ra, các javadocs nên chứa thêm thông tin về cookie handling

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

và đây là hướng dẫn dành cho httpclient v4:

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

Và đây là một số mã giả giúp (Tôi hy vọng, nó chỉ dựa trên tài liệu):

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... 

Hãy chắc chắn rằng bạn đọc javadocs cho ResponseProcessCookies và AbstractHttpClient.

+0

vừa thêm liên kết vào javadocs cho bản phát hành hiện tại – mkro

+0

ok, đã hiểu: hãy xem lớp ResponseProcessCookies để biết thêm chi tiết. HttpClientv4 dường như sử dụng nó (theo mặc định) để cư trú trong kho lưu trữ cookie. Bạn có thể truy cập nó từ AbstractHttpClient.getCookieStore – mkro

+25

Đây là vấn đề. Tôi không thể tìm thấy phương thức 'httpClient.getCookieStore(); ' – coffee

9

Tuy nhiên, một để có được những người khác bắt đầu, nhìn thấy phương pháp không tồn tại gãi đầu gãi tai ...

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

này sẽ in các giá trị của cookie. Phản hồi của máy chủ có thể có một số trường tiêu đề Set-Cookie, do đó bạn cần truy xuất mảng Header s

37

Không chắc tại sao câu trả lời được chấp nhận mô tả phương thức getCookieStore() không tồn tại. Điều đó không đúng.

Bạn phải tạo trước một cửa hàng cookie, sau đó xây dựng ứng dụng khách bằng cách sử dụng kho lưu trữ cookie đó. Sau đó, bạn có thể tham khảo cửa hàng cookie này để có danh sách 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(); 
+4

Tác phẩm trên dành cho phiên bản 4.5. – Paul

+3

Câu trả lời được chấp nhận đã hoạt động đối với phiên bản trước của v4. Cách tiếp cận này hoạt động với phương pháp mới nhất. – Peter

+1

Có, đây phải là câu trả lời được chấp nhận. Tôi chỉ di chuyển một httpclient cũ (3.x đến 4.3) sang cái mới và câu trả lời này thực sự hữu ích. –

1

Như Matt Broekhuis đã trả lời trong một bình luận trên this answer above, bạn có thể sử dụng DefaultHttpClient.getCookieStore()

Note, mà tại thời điểm đó tôi đã trả lời máy chủ của tôi bị giới hạn httpclient-4.2.5. DefaultHttpClient hiện không được dùng nữa kể từ 4.3. Tôi sẽ để lại câu trả lời này ở đây bởi vì những người khác có thể tìm thấy chính mình trong tình huống tương tự và poster ban đầu quy định họ đang sử dụng 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); 
    } 
} 

mà kết quả đầu ra

[[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]] 
+0

Tôi luôn tò mò, tại sao bỏ phiếu xuống? – Kirby

+1

Có lẽ vì 'org.apache.http.impl.client.DefaultHttpClient' không được chấp nhận. – borgmater

1

Dựa trên ví dụ trong câu hỏi ban đầu, cách để truy cập CookieStore sau khi thực hiện một yêu cầu HTTP, là bằng cách sử dụng các đối tượng trạng thái HttpContext thực hiện, trong đó sẽ tham khảo một cửa hàng cookie (mới nếu không có CookieStore được chỉ định trong HttpClientBuilder hoặc một CookieStore mới) sau khi yêu cầu được thực thi.

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

Điều này dựa trên httpcomponents-client: 4.3+ khi ClosableHttpClient và InternalHttpClient được giới thiệu.

Các vấn đề liên quan