13
11

More than 5 years have passed since last update.

RetrofitのResponseからCookieのデータを取得する

Posted at

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にセットする

CustomCookieManagerCookieHandler にセットします。

public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 略
        CookieHandler.setDefault(new CustomCookieManager());
        // 略
    }

}

これでいい感じに動くはずです。

[おまけ] 通信時にsession_store_keyを仕込む場合

こちらを参考にどうぞ
Retrofitでアレをやりたい時のTips

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11