Met behulp van OkHttp by Square https://github.com/square/okhttp, hoe kan ik:
- Een cookie ophalen die is geretourneerd van de server
- Bewaar de cookie voor aankomende verzoeken
- Gebruik de opgeslagen cookie bij volgende verzoeken
- 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.CookieManager
gebruikt, neem dan okhttp-urlconnection
op in uw project, dat JavaNetCookieJar
bevat, 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;
}
};