web-dev-qa-db-fra.com

Comment implémenter la gestion des cookies sur Android en utilisant OkHttp?

Utiliser OkHttp by Square https://github.com/square/okhttp , comment puis-je:

  1. Récupérer un cookie renvoyé par le serveur
  2. Stockez le cookie pour les demandes à venir
  3. Utilisez le cookie stocké dans les demandes suivantes
  4. Mettre à jour le cookie renvoyé par la demande suivante

Idéalement, le cookie serait stocké, renvoyé et mis à jour automatiquement à chaque demande.

46
Daniel

Pour OkHttp3, une simple implémentation acceptée de tous, non persistante CookieJar peut être la suivante:

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

Ou si vous préférez utiliser Java.net.CookieManager, comprendre okhttp-urlconnection dans votre projet, qui contient JavaNetCookieJar, une classe wrapper qui délègue à 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();
60
hidro

Pre OkHttp, vous pouvez passer un CookieHandler à votre instance OkHttpClient. Vous pouvez utiliser l'implémentation CookieManager de Java.net ou vous pouvez implémenter la vôtre si vous le souhaitez. Choisissez la politique qui convient le mieux à vos besoins.

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

OkHttp enregistrera les cookies reçus des réponses dans le CookieHandler et les lira lors de l'envoi des demandes. Il le fera pour faire correspondre les URI de demande/réponse.

33
Miguel Lavigne

J'avais besoin de partager le Cookie Jar par défaut (CookieManager.getInstance ()), donc cela semblait fonctionner correctement pour moi.

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;
        }
    };
7
hmac