所以,我开始使用Okhttp 3,大部分在网络上谈旧版本添加cookie来的客户端请求OkHttp
我需要添加一个cookie的OkHttp客户端请求的例子,它是如何与OkHttp 3完成?
在我来说,我只是想静态地将它添加到客户端调用,而不从服务器接收它
所以,我开始使用Okhttp 3,大部分在网络上谈旧版本添加cookie来的客户端请求OkHttp
我需要添加一个cookie的OkHttp客户端请求的例子,它是如何与OkHttp 3完成?
在我来说,我只是想静态地将它添加到客户端调用,而不从服务器接收它
有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();
我有一种感觉,第二个建议是你需要的。
你可以找到here一个工作示例。
感谢您的帮助,您能告诉我如何构建okhttp3.Cookie吗? –
谢谢!你有使用Cookie构建器的例子吗?另外,如果我想在域级别设置cookie而不是特定的完整url? –
@Michael第二种解决方案,拦截器,无论你的网址是什么,都可以工作。 –
如果您需要设置一个cookie单个请求你可以添加标题:
Request request = new Request.Builder()
.addHeader("Cookie", "yourcookie")
.url("http://yoursite.com")
.build();
否则,如果你想阅读由服务器返回的cookie,并将它们连接到你需要的其他请求一个CookieJar
。对于Android的你可以使用正确处理饼干PersistentCookieJar library,而且可以节省他们在共享偏好:
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
尝试设置标题,但它似乎不起作用,在服务器端没有收到cookie –
尝试使用addHeader(“Cookie”,“key = value”)? –
刚刚测试过,它不起作用,服务器没有收到cookie – furiel
我认为更好的方式来做到这一点是通过将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)
我其实没有尝试这个代码,但它应该工作。
我有同样的需求,我做了自己的图书馆。 您可以强制用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>
你应该设置头在接口声明,如下所示:调用login(@Header( “曲奇”)字符串sessionId ...)
你需要更精确的你在做什么。也许有些代码? –
@TudorLuca我需要发送http(获取帖子),同时将cookie附加到请求。在Java中,例如它是这样完成的:URL url = new URL(“http://www.google.com:80”); URLConnection conn = url.openConnection(); conn.setRequestProperty(“Cookie”,“name1 = value1; name2 = value2”); conn.connect(); –