2012-01-04 18 views

risposta

10

Nota: il primo collegamento punta a qualcosa che funzionava in HttpClient V3. Trova le informazioni relative a V4 di seguito.

Questo dovrebbe rispondere alla tua domanda

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

Quello che segue è rilevante per V4:

... in aggiunta, i javadocs dovrebbero contenere ulteriori informazioni sulla gestione dei cookie

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

ed ecco un tutorial per httpclient v4:

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

Ed ecco alcune pseudo-codice che aiuta (spero, si basa solo su documenti):

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

Assicurarsi di leggere le javadocs per ResponseProcessCookies e AbstractHttpClient.

+0

ha appena aggiunto il link a javadocs per la versione corrente – mkro

+0

ok, capito: per favore dare un'occhiata alla classe ResponseProcessCookies per maggiori dettagli. Sembra che HttpClientv4 lo usi (per impostazione predefinita) per popolare l'archivio dei cookie. Puoi accedervi da AbstractHttpClient.getCookieStore – mkro

+25

Questo è il problema. Non riesco a trovare il metodo 'httpClient.getCookieStore();' – coffee

9

Ancora un altro per ottenere altre persone hanno iniziato, vedendo i metodi inesistenti a grattarsi la testa ...

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

Ciò stamperà i valori dei cookie. La risposta del server può avere diverse Set-Cookie campi di intestazione, quindi è necessario recuperare una serie di Header s

37

Non certo perché la risposta accettata descrive un metodo getCookieStore() che non esiste. Non è corretto

È necessario creare un archivio di cookie in anticipo, quindi creare il client utilizzando tale archivio di cookie. Quindi puoi in seguito fare riferimento a questo negozio di cookie per ottenere un elenco di 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

Sopra funziona per la versione 4.5. – Paul

+3

La risposta accettata ha funzionato per la versione precedente di v4. Questo approccio funziona con l'ultimo. – Peter

+1

Sì, questa dovrebbe essere la risposta accettata. Sto semplicemente migrando un vecchio httpclient (3.x a 4.3) a quello nuovo e questa risposta aiuta davvero. –

1

Come Matt Broekhuis risolta in un commento su this answer above, è possibile utilizzare DefaultHttpClient.getCookieStore()

nota, che nel momento in cui ho risposto il mio server era limitato a httpclient-4.2.5. DefaultHttpClient è ora obsoleto a partire dal 4.3. Lascerò qui questa risposta perché altri potrebbero trovarsi nella stessa situazione e il poster originale specificò che stavano usando 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); 
    } 
} 

che emette

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

Sono sempre curioso, perché il voto negativo? – Kirby

+1

Probabilmente perché 'org.apache.http.impl.client.DefaultHttpClient' è deprecato. – borgmater

1

base all'esempio nella domanda iniziale, il modo per accedere alla CookieStore dopo l'esecuzione di una richiesta HTTP, è quello di utilizzare l'oggetto di stato HttpContext esecuzione, che farà riferimento a archivio di cookie (nuovo se non è stato specificato CookieStore in HttpClientBuilder o un nuovo CookieStore) dopo l'esecuzione di una richiesta.

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

Questo si basa sul httpcomponents-client: 4.3 e versioni successive, quando sono stati introdotti il ​​ClosableHttpClient e InternalHttpClient.

Problemi correlati