前言
由于鸿蒙的http请求系统库或者其他第三方库,都是没有处理自动携带cookie能力的,所以需要开发者手动在请求前、响应后对cookie做处理。 所以针对使用cookie作为登录态的app而言需要处理好app的登录态能通过web的认证
需求
- 下一次请求自动携带上一次的响应的cookie数据
- cookie的持久化
实现
鸿蒙的web库是有cookie管理类的,所以处理上述两个需求,压根就没有必要手动的写一个cookie管理器【类似CookieJar】
import { webview } from '@kit.ArkWeb';
webview.WebCookieManager
我们只需要写一个CookieUtil的工具类,提供api给 http在req和resp中就行,下面的代码就是api的处理过程,非常简单。核心方法就是set/get而已,就能做到http请求携带上cookie,并且能持久化。
import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';
import LogUtil from '../utils/LogUtil';
export class CookieUtil{
private static TAG = "CookieUtil"
///resp时从 http中获取cookie,保存cookie
static setCookies(url:string,cookies?:string[]){
if(cookies && cookies.length > 0){
cookies.forEach((cookie)=>{
CookieUtil.saveCookieString(cookie,url)
})
CookieUtil.saveCookieToDisk()
}
}
///使用webview.WebCookieManager.configCookieSync方法保存cookie
private static saveCookieString(cookie:string,url:string){
try {
webview.WebCookieManager.configCookieSync(url,cookie,false)
LogUtil.debug(`${CookieUtil.TAG} saveCookieString success url:${url} cookie:${cookie}`)
} catch (error) {
const err = JSON.stringify(error)
LogUtil.error(`${CookieUtil.TAG} saveCookieString catch url:${url} cookie:${cookie} error:${err}`)
}
}
///webview.WebCookieManager的持久化
private static saveCookieToDisk(){
webview.WebCookieManager.saveCookieAsync().then(()=>{
LogUtil.debug(`${CookieUtil.TAG} saveCookieToDisk success`)
}).catch((error:BusinessError)=>{
const err = JSON.stringify(error)
LogUtil.error(`${CookieUtil.TAG} saveCookieToDisk catch error:${err}`)
})
}
///req时获取cookie塞入header中
static getCookie(url:string):string{
try {
const cookie = webview.WebCookieManager.fetchCookieSync(url,false)
LogUtil.debug(`${CookieUtil.TAG} getCookie success url:${url} cookie:${cookie}}`)
return cookie
} catch (error) {
const err = JSON.stringify(error)
LogUtil.error(`${CookieUtil.TAG} getCookie catch error:${err} url:${url}`)
return ""
}
}
}