前言
OkHttp持久化Cookie使用的是OkHttp3–CookieJar 持久化Cookie
参考文章
https://www.jianshu.com/p/f1df12ceaedc
https://www.jianshu.com/p/1a222a9394ce
okhttp3依赖:
implementation("com.squareup.okhttp3:okhttp:4.9.0")
添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
一、OkHttp持久化Cookie分析
Okhttp3
默认是不持久化Cookie
的,想要持久化Cookie
就要实现CookieJar
接口,并且设置他
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new PersistenceCookieJar());
简单实现CookieJar接口
public class PersistenceCookieJar implements CookieJar {
List<Cookie> cache = new ArrayList<>();
//Http请求结束,Response中有Cookie时候回调
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
//内存中缓存Cookie
cache.addAll(cookies);
}
//Http发送请求前回调,Request中设置Cookie
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
//过期的Cookie
List<Cookie> invalidCookies = new ArrayList<>();
//有效的Cookie
List<Cookie> validCookies = new ArrayList<>();
for (Cookie cookie : cache) {
if (cookie.expiresAt() < System.currentTimeMillis()) {
//判断是否过期
invalidCookies.add(cookie);
} else if (cookie.matches(url)) {
//匹配Cookie对应url
validCookies.add(cookie);
}
}
//缓存中移除过期的Cookie
cache.removeAll(invalidCookies);
//返回List<Cookie>让Request进行设置
return validCookies;
}
};
}
二、例子
使用玩安卓平台的开放APIhttps://www.wanandroid.com/index
先发起登录请求保存cookie,之后发起查看自己收藏自己文章的请求并携带cookie
demo
package com.enjoy.networkdemo;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class CookieUnitTest {
Map<String, List<Cookie>> cookies = new HashMap<>();
@Test
public void cookieTest() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
//Http请求结束,Response中有Cookie时候回调
@Override
public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
//保存cookie
cookies.put(httpUrl.host(), list);
}
//Http发送请求前回调,Request中设置Cookie
@NotNull
@Override
public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
List<Cookie> cookies = CookieUnitTest.this.cookies.get(httpUrl.host());
return cookies == null ? new ArrayList<>() : cookies;
}
})
.build();
FormBody formBody = new FormBody.Builder().add("username", "xxx")
.add("password", "xxx").build();
Request request = new Request.Builder().url("https://www.wanandroid.com/user/login")
.post(formBody).build();
// 准备好请求的Call对象
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json")
.build();
// 准备好请求的Call对象
call = okHttpClient.newCall(request);
try {
Response response = call.execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}