Подтвердить что ты не робот

Как реализовать обработку файлов cookie на Android с помощью OkHttp?

Использование OkHttp by Square https://github.com/square/okhttp, как я могу:

  • Получить файл cookie, возвращенный с сервера
  • Сохраните файл cookie для предстоящих запросов
  • Использовать сохраненный файл cookie в последующих запросах
  • Обновить файл cookie, возвращенный последующим запросом

В идеале файл cookie будет храниться, обновляться и обновляться автоматически с каждым запросом.

4b9b3361

Ответ 1

Для OkHttp3 простая реализация accept-all, non-persistent 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();

Ответ 2

Pre OkHttp 3, вы можете передать CookieHandler в экземпляр OkHttpClient. Вы можете использовать реализацию CookieManager с java.net, или вы можете реализовать свои собственные, если хотите. Выберите политику, которая наилучшим образом подходит для ваших нужд.

OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);

OkHttp сохранит файлы cookie, полученные от ответов, в CookieHandler и прочитает их при отправке запросов. Он будет делать это для соответствия URI запроса/ответа.

Ответ 3

Мне нужно было поделиться файлом 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;
        }
    };