web-dev-qa-db-ja.com

Cookieをクライアントリクエストに追加しますOkHttp

だから私はOkhttp 3の使用を開始し、ウェブ上のほとんどの例は古いバージョンについて話しています

OkHttpクライアントリクエストにCookieを追加する必要がありますが、OkHttp 3ではどのように行われますか?

私の場合、サーバーから受信せずにクライアント呼び出しに静的に追加したいだけです

12
Michael A

これを行うには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();

2番目の提案はあなたが必要とするものだと感じています。

here の実例を見つけることができます。

19
Tudor Luca

1つのリクエストに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();
8
rciovati

同じニーズがあり、自分のライブラリを作成しました。 forcehttps://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>
2
riversun

これを行うより良い方法は、cookieJarにcookieを追加することだと思います。次に、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)

実際にこのコードを試したわけではありませんが、うまくいくはずです。

0
Wirling