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