将cookie添加到客户端请求OkHttp

问题描述 投票:11回答:5

所以我开始使用Okhttp 3,网上的大多数例子都是关于旧版本的

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

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

android okhttp okhttp3
5个回答
18
投票

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

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一个工作的例子。


8
投票

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

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

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

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

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .build();

2
投票

我有同样的需求,我自己创建了库。您可以使用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'

Maven的

<dependency>
<groupId>org.riversun</groupId>
<artifactId>okhttp3-cookie-helper</artifactId>
<version>1.0.0</version>
</dependency>

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)

我实际上没有尝试这个代码,但它应该工作。


-1
投票

你应该在接口声明中设置标题,如下所示:调用login(@Header(“Cookie”)String sessionId ...)

© www.soinside.com 2019 - 2024. All rights reserved.