web-dev-qa-db-ja.com

OkHttpを使用してAndroidでCookie処理を実装する方法は?

SquareによるOkHttpの使用 https://github.com/square/okhttp 、どうすればよいですか:

  1. サーバーから返されたCookieを取得する
  2. 今後のリクエストのためにクッキーを保存する
  3. 後続のリクエストで保存されたCookieを使用する
  4. 後続のリクエストによって返されたCookieを更新します

理想的には、Cookieはすべてのリクエストで自動的に保存、再送信、更新されます。

46
Daniel

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();
60
hidro

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に対してそうします。

33
Miguel Lavigne

デフォルトの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;
        }
    };
7
hmac