[JAVA] SetCookie du côté client avec OkHttp3

Tâche

Lors de la communication avec Android sur le serveur (base HTTP), il y a une demande de configuration du cookie côté client Android en raison de la commodité du serveur, et du côté Android avec OkHttp3 (http://square.github.io/okhttp/) J'ai réfléchi à la façon de définirCookie.

Bibliothèque utilisée ok http / 3.6.0

Préface

Lorsque j'ai déjà cherché une solution, il y avait des sujets similaires, mais c'était légèrement différent de ce que je cherchais (ou ne pouvait pas être résolu), alors j'ai décidé de le faire moi-même.

--OkHttp3 Gestion et persistance des cookies https://github.com/franmontiel/PersistentCookieJar

Solution

J'ai créé une classe d'assistance appelée ** OkHttp3CookieHelper **. Ce qui suit forcera le client à définir son propre cookie. Bien entendu, d'autres cookies émis par le serveur sont également traités. Si vous avez besoin d'un mécanisme de persistance, ajoutez-le. Il ne semble pas y avoir de problème avec la mémoire pour le moment.

Le code ci-dessous est indépendant de la plate-forme et fonctionnera à la fois sur Pure Java et Android.

Exemple de code


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

Code source pour la classe d'assistance

OkHttp3CookieHelper.java


public class OkHttp3CookieHelper {

	private final Map<String, List<Cookie>> mServerCookieStore = new ConcurrentHashMap<String, List<Cookie>>();

	private Map<String, List<Cookie>> mClientCookieStore = new ConcurrentHashMap<String, List<Cookie>>();

	private final CookieJar mCookieJar = new CookieJar() {
		@Override
		public List<Cookie> loadForRequest(HttpUrl url) {

			List<Cookie> serverCookieList = mServerCookieStore.get(url.host());

			if (serverCookieList == null) {
				serverCookieList = new ArrayList<Cookie>();
			}

			final List<Cookie> clientCookieStore = mClientCookieStore.get(url.host());

			if (clientCookieStore != null) {
				serverCookieList.addAll(clientCookieStore);
			}

			return serverCookieList != null ? serverCookieList : new ArrayList<Cookie>();
		}

		@Override
		public void saveFromResponse(HttpUrl url, List<Cookie> unmodifiableCookieList) {
			mServerCookieStore.put(url.host(), new ArrayList<Cookie>(unmodifiableCookieList));
		}

	};

	public void setCookie(String url, Cookie cookie) {

		final String host = HttpUrl.parse(url).host();

		List<Cookie> cookieListForUrl = mClientCookieStore.get(host);
		if (cookieListForUrl == null) {
			cookieListForUrl = new ArrayList<Cookie>();
			mClientCookieStore.put(host, cookieListForUrl);
		}
		putCookie(cookieListForUrl, cookie);

	}

	public void setCookie(String url, String key, String value) {
		final HttpUrl httpUrl = HttpUrl.parse(url);
		setCookie(url, Cookie.parse(httpUrl, key + "=" + value));
	}

	public void setCookie(HttpUrl httpUrl, String key, String value) {
		setCookie(httpUrl.host(), Cookie.parse(httpUrl, key + "=" + value));
	}

	public CookieJar cookieJar() {
		return mCookieJar;
	}

	private void putCookie(List<Cookie> storedCookieList, Cookie newCookie) {

		Cookie oldCookie = null;
		for (Cookie storedCookie : storedCookieList) {

			// create key for comparison
			final String oldCookieKey = storedCookie.name() + storedCookie.path();
			final String newCookieKey = newCookie.name() + newCookie.path();

			if (oldCookieKey.equals(newCookieKey)) {
				oldCookie = storedCookie;
				break;
			}
		}
		if (oldCookie != null) {
			storedCookieList.remove(oldCookie);
		}
		storedCookieList.add(newCookie);
	}

}

Destination de publication

Le code est publié ci-dessous

github https://github.com/riversun/okhttp3-cookie-helper

gradle compile 'org.riversun:okhttp3-cookie-helper:1.0.1'

maven

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

Recommended Posts

SetCookie du côté client avec OkHttp3
Comment désactiver Set-Cookie de l'API sur la face avant
Intégration API de Java avec Jersey Client
Insérez le cookie sélénium dans le client okHttp3
[Java] Réglez l'heure depuis le navigateur avec jsoup
Ressort avec Kotorin ―― 3. Omettre les crochets d'onde de la fonction
Faire vibrer le bracelet avec Bluetooth à partir de l'application Android
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données
Réglez la date et l'heure à partir de la chaîne de caractères avec POI
[MT] Spécifiez la catégorie d'article d'Android avec l'API de données