cookies okhttp3

Manejo automático de cookies con OkHttp 3



okhttp3 (9)

Estoy usando okhttp 3.0.1.

En todas partes estoy obteniendo ejemplos para el manejo de cookies que es con okhttp2

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

¿Puede alguien guiarme sobre cómo usar en la versión 3. El método setCookieHandler no está presente en la versión 3.


Añadiendo la compile "com.squareup.okhttp3:okhttp-urlconnection:3.8.1" a su build.gradle.

Y luego agregando

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

me ayudó sin agregar ninguna dependencia de terceros, excepto la de OkHttp.


Aquí está funcionando la implementación de CookieJar para OkHttp3. Si tiene varias instancias de OkHttp3 (por lo general, debe tener solo una instancia y usarla como singletone), debe configurar la misma instancia de cookiejar para todos los clientes http para que puedan compartir cookies. Esta implementación no es cookies persistentes (todas se descartarán al reiniciar la aplicación), pero debería ser fácil implementar la persistencia SharedPreferences en lugar de la lista de cookies en memoria (cookieStore).

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


Aquí tiene un enfoque simple para crear su propio CookieJar. Se puede extender como lo desee. Lo que hice fue implementar un CookieJar y construir OkHttpClient usando OkHttpClient.Builder con este CookieJar.

public class MyCookieJar implements CookieJar { private List<Cookie> cookies; @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { this.cookies = cookies; } @Override public List<Cookie> loadForRequest(HttpUrl url) { if (cookies != null) return cookies; return new ArrayList<Cookie>(); } }

Así es como puede crear el OkHttpClient

OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.cookieJar(new MyCookieJar()); OkHttpClient client = builder.build();


Puedo mostrarle una biblioteca para permitir que OkHttp3 maneje las cookies automáticamente. Se puede usar fácilmente.

Simplemente mantenga las cookies en la memoria, para persistir usted mismo si lo necesita. Ejecutar en entorno Android y Java puro.

String url = "https://example.com/webapi"; OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper(); OkHttpClient client = new OkHttpClient.Builder() .cookieJar(cookieHelper.cookieJar()) .build(); Request request = new Request.Builder() .url(url) .build();

Gradle

compile ''org.riversun:okhttp3-cookie-helper:1.0.0''

Maven

<dependency> <groupId>org.riversun</groupId> <artifactId>okhttp3-cookie-helper</artifactId> <version>1.0.0</version> </dependency>


Si quiere usar el nuevo OkHttp 3 CookieJar y deshacerse de la okhttp-urlconnection , puede usar este PersistentCookieJar .

Solo necesita crear una instancia de PersistentCookieJar y luego pasarla al generador OkHttp :

CookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cookieJar(cookieJar) .build();


Utilicé la solución de @ gncabrera, pero también creé una clase auxiliar para ayudar con la inicialización y también para que sea fácil compartir un CookieJar en toda la aplicación.

public class OkHttpClientCreator { private static CookieJar mCookieJar; public static OkHttpClient.Builder getNewHttpClientBuilder(boolean isDebug, boolean useCookies) { if (mCookieJar == null && useCookies) { mCookieJar = new BasicCookieJar(); } OkHttpClient.Builder builder = new OkHttpClient.Builder(); if (useCookies) { builder.cookieJar(mCookieJar); } if (isDebug) { builder.addInterceptor(new LoggingInterceptor()); } return builder; } public static OkHttpClient getNewHttpClient(boolean isDebug, boolean useCookies) { return getNewHttpClientBuilder(isDebug, useCookies).build(); } }

El interceptor de registro se utiliza en modo de depuración para imprimir la información de la solicitud y se comparte la instancia del contenedor de cookies. a través de las personas que llaman, de modo que si las solicitudes necesitan usar un controlador de cookies común, pueden hacerlo. Estas cookies no persistirán durante los lanzamientos de aplicaciones, pero eso no es un requisito para mi aplicación ya que usamos sesiones basadas en tokens y la única necesidad de cookies es el corto tiempo entre el inicio de sesión y la generación del token.

Nota: BasicCookieJar es la misma implementación que MyCookieJar de gncabrera


ahora mismo estoy jugando con eso. intente PersistentCookieStore , agregue dependencias de gradle para JavaNetCookieJar :

compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1"

e init

// init cookie manager CookieHandler cookieHandler = new CookieManager( new PersistentCookieStore(ctx), CookiePolicy.ACCEPT_ALL); // init okhttp 3 logger HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); // init OkHttpClient OkHttpClient httpClient = new OkHttpClient.Builder() .cookieJar(new JavaNetCookieJar(cookieHandler)) .addInterceptor(logging) .build();

``


solución mínima que persiste la cookie después de la primera ejecución

public class SharedPrefCookieJar implements CookieJar { Map<String, Cookie> cookieMap = new HashMap(); private Context mContext; private SharedPrefsManager mSharedPrefsManager; @Inject public SharedPrefCookieJar(Context context, SharedPrefsManager sharedPrefsManager) { mContext = context; mSharedPrefsManager = sharedPrefsManager; cookieMap = sharedPrefsManager.getCookieMap(context); if (cookieMap == null) { cookieMap = new HashMap<>(); } } @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { for (Cookie cookie : cookies) { cookieMap.put(cookie.name(), cookie); } mSharedPrefsManager.setCookieMap(mContext, cookieMap); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> validCookies = new ArrayList<>(); for (Map.Entry<String, Cookie> entry : cookieMap.entrySet()) { Cookie cookie = entry.getValue(); if (cookie.expiresAt() < System.currentTimeMillis()) { } else { validCookies.add(cookie); } } return validCookies; } }

con daga

@Module public class ApiModule { @Provides @Singleton InstagramService provideInstagramService(OkHttpClient client) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(InstagramService.BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); InstagramService instagramService = retrofit.create(InstagramService.class); return instagramService; } @Provides @Singleton OkHttpClient provideOkHttpClient(SharedPrefCookieJar sharedPrefCookieJar){ OkHttpClient client; OkHttpClient.Builder builder = new OkHttpClient.Builder(); if(BuildConfig.DEBUG) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder .addInterceptor(httpLoggingInterceptor) .addInterceptor(new InstagramHeaderInterceptor()) .addNetworkInterceptor(new LoggingInterceptor()); } client = builder.cookieJar(sharedPrefCookieJar).build(); return client; } }


PersistentCookieJar biblioteca PersistentCookieJar para okhttp3 y retrofit.2. El beneficio de este enfoque es: no es necesario manipular su solicitud okhttp. Simplemente configure las cookies o la sesión al crear la modificación

1. primero agregue esto a su build.gradle (nombre del proyecto)

allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } } 2. agregue esto a su build.gradle

compile ''com.github.franmontiel:PersistentCookieJar:v1.0.1'' 3. construir retroadaptación como esta

public static Retrofit getClient(Context context) { ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cookieJar(cookieJar) .build(); if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); } return retrofit; }