Me gustaría hacer una solicitud http a un servidor remoto mientras manejo correctamente las cookies (por ejemplo, almacenar cookies enviadas por el servidor y enviarlas cuando realizo solicitudes posteriores). Sería bueno conservar todas y cada una de las cookies, pero en realidad la única que me importa es la cookie de sesión.
Con java.net, parece que la forma preferida de hacer esto es usar java.net.CookieHandler (clase base abstracta) y java.net.CookieManager (implementación concreta). Android tiene java.net.CookieHandler, pero no parece tener java.net.CookieManager.
Podría codificarlo todo a mano inspeccionando los encabezados http, pero parece que debe haber una manera más fácil.
¿Cuál es la forma correcta de hacer solicitudes http en Android mientras se conservan las cookies?
java.net.CookieManager
ahora es compatible con Android desde la versión 2.3 (API nivel 9): developer.android.com/reference/java/net/CookieManager.htmlRespuestas:
Resulta que Google Android viene con Apache HttpClient 4.0, y pude descubrir cómo hacerlo usando el ejemplo de "Inicio de sesión basado en formularios" en los documentos de HttpClient :
https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
fuente
The method getCookieStore() is undefined for the type HttpClient
, ¿tengo que cambiarmeList<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
? Porque si lo hago, funciona.Una cookie es solo otro encabezado HTTP. Siempre puede configurarlo mientras realiza una llamada HTTP con la biblioteca apache o con HTTPUrlConnection. De cualquier manera, debería poder leer y configurar cookies HTTP de esta manera.
Puedes leer este artículo para más información.
Puedo compartir mi paz de código para demostrar lo fácil que puede hacerlo.
fuente
Dado que la biblioteca Apache está en desuso , para aquellos que quieran usar
HttpURLConncetion
, escribí esta clase para enviar Obtener y Publicar Solicitud con la ayuda de esta respuesta :fuente
No trabajo con Google Android, pero creo que encontrarás que no es tan difícil hacer que esto funcione. Si lees la parte relevante del tutorial de Java , verás que un manejador de cookies registrado recibe devoluciones de llamada del código HTTP.
Entonces, si no hay un valor predeterminado (¿ha verificado si
CookieHandler.getDefault()
realmente es nulo?), Simplemente puede extender CookieHandler, implementar put / get y hacer que funcione de manera bastante automática. Asegúrese de considerar el acceso concurrente y cosas similares si va por esa ruta.editar: Obviamente, tendría que establecer una instancia de su implementación personalizada como el controlador predeterminado
CookieHandler.setDefault()
para recibir las devoluciones de llamada. Olvidé mencionar eso.fuente