Hoe kan ik cookieverwerking op Android implementeren met OkHttp?

Met behulp van OkHttp by Square https://github.com/square/okhttp, hoe kan ik:

  1. Een cookie ophalen die is geretourneerd van de server
  2. Bewaar de cookie voor aankomende verzoeken
  3. Gebruik de opgeslagen cookie bij volgende verzoeken
  4. Werk de cookie bij die door het volgende verzoek wordt geretourneerd

Idealiter wordt de cookie bij elk verzoek automatisch opgeslagen, opnieuw verzonden en bijgewerkt.


Antwoord 1, autoriteit 100%

Voor OkHttp3 kan een eenvoudige, niet-permanente, CookieJar-implementatie als volgt zijn:

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

Of als u liever java.net.CookieManagergebruikt, neem dan okhttp-urlconnectionop in uw project, dat JavaNetCookieJarbevat, een wrapper klasse die delegeert naar 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();

Antwoord 2, autoriteit 49%

Pre OkHttp 3,
u kunt een CookieHandler doorgeven aan uw OkHttpClient-instantie. U kunt de CookieManager-implementatie van java.net gebruiken of u kunt uw eigen implementatie implementeren als u dat wilt. Kies het beleid dat het beste bij uw behoeften past.

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

OkHttp slaat cookies die zijn ontvangen van Reacties op in de CookieHandler en leest deze bij het verzenden van verzoeken. Het zal dit doen voor het matchen van verzoek/antwoord-URI’s.


Antwoord 3, autoriteit 13%

Ik moest de standaard Cookie Jar (CookieManager.getInstance()) delen, dus dit leek goed te werken voor mij.

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

Other episodes