Как реализовать обработку файлов cookie на Android с помощью OkHttp?
Использование OkHttp by Square https://github.com/square/okhttp, как я могу:
- Получить файл cookie, возвращенный с сервера
- Сохраните файл cookie для предстоящих запросов
- Использовать сохраненный файл cookie в последующих запросах
- Обновить файл cookie, возвращенный последующим запросом
В идеале файл cookie будет храниться, обновляться и обновляться автоматически с каждым запросом.
Ответы
Ответ 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;
}
};