web-dev-qa-db-fra.com

Ajouter un cookie à la demande du client OkHttp

J'ai donc commencé à utiliser Okhttp 3 et la plupart des exemples sur le Web parlent de versions plus anciennes

Je dois ajouter un cookie aux demandes du client OkHttp, comment cela se fait-il avec OkHttp 3?

Dans mon cas, je veux simplement l'ajouter statiquement aux appels clients sans le recevoir du serveur

12
Michael A

Vous pouvez procéder de deux manières:

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

ou simplement

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

J'ai le sentiment que la deuxième suggestion est ce dont vous avez besoin.

Vous pouvez trouver ici un exemple de travail.

19
Tudor Luca

Si vous devez définir un cookie pour une seule demande, vous pouvez simplement ajouter l'en-tête:

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

Sinon, si vous souhaitez lire les cookies retournés par le serveur et les joindre à d'autres requêtes, vous aurez besoin d'un CookieJar. Pour Android vous pouvez utiliser la bibliothèque PersistentCookieJar qui gère correctement les cookies et les enregistre également dans les préférences partagées:

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

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

J'avais les mêmes besoins, j'ai fait ma propre bibliothèque. Vous pouvez forcer définir des cookies comme celui-ci avec OkHttp3CookieHelper sur 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();

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

Je pense qu'une meilleure façon de le faire est d'ajouter le cookie au cookieJar. OkHttp ajoutera alors automatiquement les cookies à la demande avec un intercepteur: 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)

Je n'ai pas réellement essayé ce code, mais cela devrait fonctionner.

0
Wirling