向客户端请求 OkHttp 添加 cookie
Add cookie to client request OkHttp
所以我开始使用 Okhttp 3,网络上的大多数示例都在谈论旧版本
我需要向 OkHttp 客户端请求添加一个 cookie,OkHttp 3 是如何完成的?
在我的例子中,我只是想将它静态地添加到客户端调用中而不从服务器接收它
您可以通过两种方式执行此操作:
OkHttpClient client = new OkHttpClient().newBuilder()
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
Arrays.asList(createNonPersistentCookie());
}
})
.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(chain -> {
final Request original = chain.request();
final Request authorized = original.newBuilder()
.addHeader("Cookie", "cookie-name=cookie-value")
.build();
return chain.proceed(authorized);
})
.build();
感觉第二个建议是你需要的
您可以找到 here 一个工作示例。
如果您需要为单个请求设置 cookie,您只需添加 header:
Request request = new Request.Builder()
.addHeader("Cookie", "yourcookie")
.url("http://yoursite.com")
.build();
否则,如果您想读取服务器返回的 cookie 并将它们附加到其他请求,您将需要 CookieJar
。对于 Android,您可以使用 PersistentCookieJar library 正确处理 cookie 并将它们保存在共享首选项中:
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
我认为更好的方法是将 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)
我实际上并没有尝试这段代码,但它应该可以工作。
我有同样的需求,我制作了自己的图书馆。
您可以 force 在 https://github.com/riversun/okhttp3-cookie-helper 上使用 OkHttp3CookieHelper 设置这样的 cookie。
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();
Gradle
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>
你应该在接口声明中设置headers,像这样: Call login(@Header("Cookie") String sessionId...)
所以我开始使用 Okhttp 3,网络上的大多数示例都在谈论旧版本
我需要向 OkHttp 客户端请求添加一个 cookie,OkHttp 3 是如何完成的?
在我的例子中,我只是想将它静态地添加到客户端调用中而不从服务器接收它
您可以通过两种方式执行此操作:
OkHttpClient client = new OkHttpClient().newBuilder()
.cookieJar(new CookieJar() {
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
Arrays.asList(createNonPersistentCookie());
}
})
.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(chain -> {
final Request original = chain.request();
final Request authorized = original.newBuilder()
.addHeader("Cookie", "cookie-name=cookie-value")
.build();
return chain.proceed(authorized);
})
.build();
感觉第二个建议是你需要的
您可以找到 here 一个工作示例。
如果您需要为单个请求设置 cookie,您只需添加 header:
Request request = new Request.Builder()
.addHeader("Cookie", "yourcookie")
.url("http://yoursite.com")
.build();
否则,如果您想读取服务器返回的 cookie 并将它们附加到其他请求,您将需要 CookieJar
。对于 Android,您可以使用 PersistentCookieJar library 正确处理 cookie 并将它们保存在共享首选项中:
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
我认为更好的方法是将 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)
我实际上并没有尝试这段代码,但它应该可以工作。
我有同样的需求,我制作了自己的图书馆。 您可以 force 在 https://github.com/riversun/okhttp3-cookie-helper 上使用 OkHttp3CookieHelper 设置这样的 cookie。
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();
Gradle
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>
你应该在接口声明中设置headers,像这样: Call login(@Header("Cookie") String sessionId...)