20

所以我开始使用 Okhttp 3 并且网络上的大多数示例都在谈论旧版本

我需要在 OkHttp 客户端请求中添加一个 cookie,它是如何使用 OkHttp 3 完成的?

在我的情况下,我只是想将它静态添加到客户端调用而不从服务器接收它

4

5 回答 5

37

有两种方法可以做到这一点:

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();

我觉得第二个建议是你需要的。

您可以在此处找到一个工作示例。

于 2016-03-02T09:52:42.273 回答
15

如果您需要为单个请求设置 cookie,您只需添加标头:

Request request = new Request.Builder()
        .addHeader("Cookie", "yourcookie")
        .url("http://yoursite.com")
        .build();

否则,如果您想读取服务器返回的 cookie 并将它们附加到其他请求,您将需要一个CookieJar. 对于 Android,您可以使用PersistentCookieJar 库,它可以正确处理 cookie 并将它们保存在共享首选项中:

ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .build();
于 2016-03-02T10:22:39.527 回答
6

我有同样的需求,我建立了自己的图书馆。您可以在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();

摇篮

compile 'org.riversun:okhttp3-cookie-helper:1.0.0'

马文

<dependency>
<groupId>org.riversun</groupId>
<artifactId>okhttp3-cookie-helper</artifactId>
<version>1.0.0</version>
</dependency>
于 2017-03-25T09:58:36.117 回答
0

我认为更好的方法是将 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)

我实际上并没有尝试过这段代码,但它应该可以工作。

于 2017-02-03T08:21:10.027 回答
-3

您应该在接口声明中设置标题,如下所示: Call login(@Header("Cookie") String sessionId...)

于 2017-12-23T03:47:43.390 回答