Cómo implementar la manipulación de cookies en Android usando OkHttp?

Usando OkHttp por Square https://github.com/square/okhttp , ¿cómo puedo:

  1. Recuperar una cookie devuelta desde el servidor
  2. Guarde la cookie para las próximas solicitudes
  3. Utilizar la cookie almacenada en las solicitudes posteriores
  4. Actualizar la cookie devuelta por la solicitud subsiguiente

Lo ideal sería que la cookie se almacenara, resent y se actualizara automáticamente con cada solicitud.

Para OkHttp3, una simple y CookieJar , no persistente aplicación CookieJar puede ser la siguiente:

 OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new CookieJar() { private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url, cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url); return cookies != null ? cookies : new ArrayList<Cookie>(); } }) .build(); 

O si prefiere utilizar java.net.CookieManager , incluya okhttp-urlconnection en su proyecto, que contiene JavaNetCookieJar , una clase de contenedor que delega a java.net.CookieHandler :

 dependencies { compile "com.squareup.okhttp3:okhttp:3.0.0" compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0" } 

 CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new JavaNetCookieJar(cookieManager)) .build(); 

Pre OkHttp 3 , puede pasar un CookieHandler a su instancia de OkHttpClient. Puede utilizar la implementación de CookieManager desde java.net o puede implementar la suya si lo desea. Elija la política que mejor funcione para sus necesidades.

 OkHttpClient client = new OkHttpClient(); CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); client.setCookieHandler(cookieManager); 

OkHttp guardará las cookies recibidas de las respuestas en el CookieHandler y leerá de él al enviar solicitudes. Lo hará para coincidir con solicitud / respuesta URIs.

Necesitaba compartir el Cookie Jar predeterminado (CookieManager.getInstance ()) así que esto parecía funcionar bien para mí.

 return new CookieJar() { @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { CookieManager cookieManager = CookieManager.getInstance(); for (Cookie cookie : cookies) { cookieManager.setCookie(url.toString(), cookie.toString()); } } @Override public List<Cookie> loadForRequest(HttpUrl url) { CookieManager cookieManager = CookieManager.getInstance(); List<Cookie> cookies = new ArrayList<>(); if (cookieManager.getCookie(url.toString()) != null) { String[] splitCookies = cookieManager.getCookie(url.toString()).split("[,;]"); for (int i=0; i<splitCookies.length; i++) { cookies.add(Cookie.parse(url, splitCookies[i].trim())); } } return cookies; } }; 
  • Subida de archivos con okhttp
  • El uso de la dirección IP para el nombre común en el certificado del servidor no funciona en Android?
  • ¿Cómo alertar al usuario utilizando Toast que la solicitud OkHttp devolvió algo distinto de 200?
  • Reemplazar los parámetros de ruta comunes en la modificación posterior 2 con okhttp
  • Cómo agregar un encabezado a un objeto de solicitud OkHttp que se ha construido?
  • ¿Cómo obtener la URL redireccionada de OkHttp3?
  • Error retrofit.RetrofitError: java.io.EOFException para Android
  • OkHttp javax.net.ssl.SSLPeerUnverifiedException: Nombre de host domain.com no verificado
  • MissingResourceException: No se puede encontrar el paquete para el nombre base sun.util.logging.resources.logging, locale en_US
  • Retrofit 2.0b2: ¿Cómo obtener InputStream de la respuesta?
  • ¿Necesito escribir un código de manejo de proxy personalizado para OkHttp en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.