Cómo implementar la manipulación de cookies en Android usando OkHttp?
Usando OkHttp por Square https://github.com/square/okhttp , ¿cómo puedo:
- Recuperar una cookie devuelta desde el servidor
- Guarde la cookie para las próximas solicitudes
- Utilizar la cookie almacenada en las solicitudes posteriores
- 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.
- Android Okhttp llamadas asincrónicas
- Confiando en todos los certificados con okHttp
- Cómo agregar un token de autenticación en el encabezado de la biblioteca Picasso
- Android OkHttp InputStream java.IOException.closed
- Cómo resolver java.lang.AssertionError al crear OkHttpClient en mockito?
- Android forma correcta de utilizar OKHTTP singleton para consultas paralelas con cookies
- Obtención de solicitud de contenido corporal mediante el método POST de Retrofit 2.0
- Glide - agregar cabecera a la solicitud
- Android OkHttp con autenticación básica
- OkHttp en android para realizar solicitudes de red
- ¿Creación de directorio para caché OkHttp en Android?
- ¿Cómo hacer que OKHTTP envíe una solicitud sin un cuerpo de solicitud?
- Picasso no carga imágenes
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; } };
- Prácticas recomendadas de Android SharedPreferences
- No se pudo encontrar la información de instrumentación para: ComponentInfo {} – error intentando probar en IntelliJ con Gradle