Retrofitを使っていて、レスポンスヘッダからCookie情報を取り出したい場合のやり方です。結論から言うと、 java.net.CookieManager
を拡張して実装できます。
2015/09/03時点の情報なので、今後Retrofit2がリリースされたら変わる可能性があります。
CustomCookieManager
を作る
RetrofitのコールバックインターフェースにResponse
クラスがありますが、このクラスからアクセスはできないので、独自のCookieManagerを作ります。
package com.konifar.network;
import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.URI;
import java.util.List;
import java.util.Map;
public class CustomCookieManager extends CookieManager {
private static final String SET_COOKIE_KEY = "Set-Cookie";
private static final String EQ = "=";
public CustomCookieManager() {
super.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
}
@Override
public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
super.put(uri, responseHeaders);
final List<String> cookieList = responseHeaders.get(SET_COOKIE_KEY);
if (cookieList == null) return;
for (String cookieString : cookieList) {
if (cookieString != null) {
for (String cookie : cookieString.split(";")) {
// session_key(適当)というnameでセッション取得する場合
if (cookie.startsWith("session_key") && cookie.contains(EQ)) {
String session = cookie.split(EQ)[1];
// キャッシュしたりとか好きなようにする
return;
}
}
}
}
}
}
CookieHandlerにセットする
CustomCookieManager
を CookieHandler
にセットします。
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 略
CookieHandler.setDefault(new CustomCookieManager());
// 略
}
}
これでいい感じに動くはずです。
[おまけ] 通信時にsession_store_keyを仕込む場合
こちらを参考にどうぞ
Retrofitでアレをやりたい時のTips