鸿蒙http请求cookie管理很easy

595 阅读1分钟

前言

由于鸿蒙的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 ""
    }
  }

}