Utiliser OkHttp by Square https://github.com/square/okhttp , comment puis-je:
Idéalement, le cookie serait stocké, renvoyé et mis à jour automatiquement à chaque demande.
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();
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.
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;
}
};