id | title | sidebar_label |
---|---|---|
cookie | 使用Cookie | 使用Cookie |
Cookie是由服务器端生成,发送给客户端(一般为浏览器),并以key-value形式处理和保存在客户端的一组数据。在下次请求同一域名网站时,会将该Cookie数据再次发送到服务端。
Forest从1.5.0-RC1
版本开始支持Cookie,可以通过回调函数和拦截器两种方式来处理Cookie。
回调函数方式
在请求接口的参数列表中加入OnSaveCookie
和 OnLoadCookie
回调函数
OnSaveCookie
: 在请求响应成功后,需要保存Cookie时调用该回调函数
OnLoadCookie
: 在发送请求前,需要加载Cookie时调用该回调函数
/**
* 登入接口(需要接受Cookie)
*/
@Post("http://localhost:8080/login?username=foo")
ForestResponse testLogin(@Body UserLoginDTO userLogin, OnSaveCookie onSaveCookie);
/**
* 登入后测试接口(需要传入Cookie)
*/
@Post("http://localhost:8080/test")
ForestResponse testAfterLogin(OnLoadCookie onLoadCookie);
Forest不会自动处理或持久化服务端传来的Cookie数据,需要自己在回调函数中接到Cookie后自行处理。
AtomicReference<ForestCookie> cookieAtomic = new AtomicReference<>(null);
// 调用登入接口
testClient.testLogin(userLogin, (request, cookies) -> {
// 将服务端传来的Cookie放入cookieAtomic
cookieAtomic.set(cookies.allCookies().get(0));
});
// 获取Cookie
ForestCookie cookie = cookieAtomic.get();
// 调用登入后的测试接口
ForestResponse response = testClient.testAfterLogin((request, cookies) -> {
// 将之前调用登入接口获得的Cookie传入请求发送到服务端
cookies.addCookie(cookie);
});
拦截器方式
拦截器方式原理上和回调函数方式一样,只不过OnSaveCookie
和 OnLoadCookie
回调函数接口变成了拦截器中的 onSaveCookie(ForestRequest, ForestCookies)
方法和 onLoadCookie(ForestRequest, ForestCookies)
方法。
/**
* 处理Cookie的拦截器
*/
public class CookieInterceptor implements Interceptor {
// Cookie在本地存储的缓存
private Map<String, List<ForestCookie>> cookieCache = new ConcurrentHashMap<>();
/**
* 在请求响应成功后,需要保存Cookie时调用该方法
*
* @param request Forest请求对象
* @param cookies Cookie集合,通过响应返回的Cookie都从该集合获取
*/
@Override
public void onSaveCookie(ForestRequest request, ForestCookies cookies) {
// 获取请求URI的主机名
String host = request.getURI().getHost();
// 将从服务端获得的Cookie列表放入缓存,主机名作为Key
cookieCache.put(host, cookies.allCookies());
}
/**
* 在发送请求前,需要加载Cookie时调用该方法
*
* @param request Forest请求对象
* @param cookies Cookie集合, 需要通过请求发送的Cookie都添加到该集合
*/
@Override
public void onLoadCookie(ForestRequest request, ForestCookies cookies) {
// 获取请求URI的主机名
String host = request.getURI().getHost();
// 从缓存中获取之前获得的Cookie列表,主机名作为Key
List<ForestCookie> cookieList = cookieCache.get(host);
// 将缓存中的Cookie列表添加到请求Cookie列表中,准备发送到服务端
cookies.addAllCookies(cookieList);
}
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
// ... ...
}
@Override
public void onSuccess(Object data, ForestRequest request, ForestResponse response) {
// ... ...
}
}