Добавить cookie в запрос клиента OkHttp
поэтому я начал использовать Okhttp 3 и большинство примеров в интернете говорят о старых версиях
Мне нужно добавить cookie в клиентские запросы OkHttp, как это делается с OkHttp 3?
в моем случае я просто хочу статически добавить его в клиентские вызовы, не получая его от сервера
5 ответов
есть 2 способа сделать это:
OkHttpClient client = new OkHttpClient().newBuilder()
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
final ArrayList<Cookie> oneCookie = new ArrayList<>(1);
oneCookie.add(createNonPersistentCookie());
return oneCookie;
}
})
.build();
...
public static Cookie createNonPersistentCookie() {
return new Cookie.Builder()
.domain("publicobject.com")
.path("/")
.name("cookie-name")
.value("cookie-value")
.httpOnly()
.secure()
.build();
}
или просто
OkHttpClient client = new OkHttpClient().newBuilder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
final Request original = chain.request();
final Request authorized = original.newBuilder()
.addHeader("Cookie", "cookie-name=cookie-value")
.build();
return chain.proceed(authorized);
}
})
.build();
у меня есть ощущение, что второе предложение-это то, что вам нужно.
Вы можете найти здесь рабочий пример.
Если вам нужно установить куки для одного запроса, вы можете просто добавить заголовок:
Request request = new Request.Builder()
.addHeader("Cookie", "yourcookie")
.url("http://yoursite.com")
.build();
В противном случае, если вы хотите прочитать cookies, возвращенные сервером, и присоединить их к другим запросам, вам понадобится CookieJar
. Для Android вы можете использовать библиотека PersistentCookieJar который обрабатывает файлы cookie правильно, а также сохраняет их в общих настройках:
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
у меня были те же потребности, я сделал свою собственную библиотеку. Ты можешь!--4-->силу установить куки, как это с OkHttp3CookieHelper на https://github.com/riversun/okhttp3-cookie-helper .
String url = "https://example.com/webapi";
OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper();
cookieHelper.setCookie(url, "cookie_name", "cookie_value");
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(cookieHelper.cookieJar())
.build();
Request request = new Request.Builder()
.url(url)
.build();
ш
compile 'org.riversun:okhttp3-cookie-helper:1.0.0'
Maven
<dependency>
<groupId>org.riversun</groupId>
<artifactId>okhttp3-cookie-helper</artifactId>
<version>1.0.0</version>
</dependency>
Я думаю, что лучший способ сделать это-добавить cookie в cookieJar. Затем OkHttp автоматически добавит файлы cookie в запрос с помощью перехватчика: https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/internal/http/BridgeInterceptor.java
cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
// add cookies to cookiejar
cookieJar.saveFromResponse("Cookie", listOfCookiesToAdd);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(cookieJar)
Я на самом деле не попробовать этот код, но он должен работать.
вы должны установить заголовки в объявлении интерфейса, например: вызовите login (@Header ("Cookie") String sessionId...)