2012-01-04 20 views

Respuesta

10

Nota: El primer enlace apunta a algo que solía funcionar en HttpClient V3. Encuentra información relacionada con V4 a continuación.

Esto debe responder a su pregunta

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

El siguiente es relevante para V4:

... Además, los javadocs deben contener más información sobre la administración de cookies

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

y aquí hay un tutorial para httpclient v4:

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

Y aquí es un poco de pseudo-código que ayuda (espero, se basa únicamente en documentos):

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

Por favor asegúrese de leer las javadocs para ResponseProcessCookies y AbstractHttpClient.

+0

acaba de agregar el enlace a javadocs para la versión actual – mkro

+0

bien, lo tengo: por favor, eche un vistazo a la clase ResponseProcessCookies para más detalles. HttpClientv4 parece usarlo (de forma predeterminada) para llenar el almacén de cookies. Puede acceder desde AbstractHttpClient.getCookieStore – mkro

+25

Este es el problema. No puedo encontrar el método 'httpClient.getCookieStore();' – coffee

9

Sin embargo, otro para llegar a otras personas comenzaron, al ver que no existen métodos rascándose la cabeza ...

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

Esto imprimirá los valores de las cookies. La respuesta del servidor puede tener varios Set-Cookie campos de cabecera, por lo que necesita para recuperar una matriz de Header s

37

No sé por qué la respuesta aceptada describe un método getCookieStore() que no existe. Eso es incorrecto.

Debe crear una tienda de cookies de antemano, luego compilar el cliente utilizando ese almacén de cookies. Luego, puede consultar esta tienda de cookies para obtener una lista de cookies.

/* 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

Arriba funciona para la versión 4.5. – Paul

+3

La respuesta aceptada funcionó para la versión anterior de v4. Este enfoque funciona con el último. – Peter

+1

Sí, esta debería ser la respuesta aceptada. Solo estoy migrando un httpclient antiguo (3.xa 4.3) al nuevo y esta respuesta realmente ayuda. –

1

Como Matt Broekhuis respondió en un comentario en this answer above, puede utilizar DefaultHttpClient.getCookieStore()

Tenga en cuenta, que en el momento que yo respondí mi servidor estaba limitada a httpclient-4.2.5. DefaultHttpClient ahora está en desuso a partir de 4.3. Voy a dejar esta respuesta aquí porque otros pueden encontrarse en la misma situación y el cartel original especificó que estaban 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); 
    } 
} 

que emite

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

Siempre tengo curiosidad, ¿por qué el voto hacia abajo? – Kirby

+1

Probablemente porque 'org.apache.http.impl.client.DefaultHttpClient' está en desuso. – borgmater

1

Basado en el ejemplo de la pregunta inicial, la forma de acceder al CookieStore después de ejecutar una solicitud HTTP, es mediante el uso del objeto de estado HttpContext ejecución, que hará referencia a un cookie store (nuevo si no se especificó CookieStore en HttpClientBuilder, o en una nueva CookieStore) después de que se ejecuta una solicitud.

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

Esto se basa en httpcomponents-cliente: 4.3+ cuando se introdujeron la ClosableHttpClient y InternalHttpClient.

Cuestiones relacionadas