SquareによるOkHttpの使用 https://github.com/square/okhttp 、どうすればよいですか:
理想的には、Cookieはすべてのリクエストで自動的に保存、再送信、更新されます。
OkHttp3の場合、単純なaccept-all、非永続CookieJar
実装は次のようになります。
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();
または、Java.net.CookieManager
を使用する場合は、okhttp-urlconnection
に委任するラッパークラスであるJavaNetCookieJar
を含むプロジェクトに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、OkHttpClientインスタンスにCookieHandlerを渡すことができます。 Java.netのCookieManager実装を使用することも、必要に応じて独自の実装を実装することもできます。ニーズに最適なポリシーを選択してください。
OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);
OkHttpは、Responsesから受け取ったCookieをCookieHandlerに保存し、リクエストの送信時にCookieHandlerから読み取ります。一致する要求/応答URIに対してそうします。
デフォルトのCookie Jar(CookieManager.getInstance())を共有する必要があったので、これでうまくいくように思えました。
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;
}
};