当前位置: 首页 > article >正文

HarmonyOS axios 拦截器处理token 及异常

验证用户登录   访问权限控制

需求:

  1. 请求拦截器统一携带 token:开头部分需要拼接 Bearer+空格
  2. 响应拦截器统一处理异常 
  • 400:打印错误信息(登录接口测试)
  • 401:移除用户信息,去登录

import axios, { InternalAxiosRequestConfig, AxiosError, AxiosResponse, AxiosRequestConfig } from '@ohos/axios'
import { promptAction } from '@kit.ArkUI'
import { auth } from './Auth'
import { Logger } from './Logger'

// 增加类型
export interface APIErrorType {
  message: string
  msg: string
  code: string
}

// 实例化 通用配置
const instance = axios.create({
  baseURL: 'https://meikou-api.itheima.net/',
  timeout: 5000
})

// 拦截器配置
// 请求拦截器
// token配置等

instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  const user = auth.getUser()
  if (user.token) {
    config.headers['Authorization'] = `Bearer ${user.token}`
  }
  return config
}, (error: AxiosError) => {
  return Promise.reject(error)
})


// 添加响应拦截器
// 错误统一处理等

instance.interceptors.response.use((response: AxiosResponse) => {
  return response
}, (error: AxiosError<APIErrorType>) => {
  if (error.response?.status === 401) {
    promptAction.showToast({ message: '登录过期' })
    // 删除用户信息 去登录页
    auth.removeUser()
    router.pushUrl({
      url: 'pages/LoginPage'
    })
  } else {
    promptAction.showToast({ message: error.response?.data.message })
  }
  return Promise.reject(error)
})


export interface HttpResponse<T> {
  code: string
  msg: string
  result: T
}

export type ResponseType<T> = AxiosResponse<HttpResponse<T>>

// 网络请求封装请求方法
export class RequestAxios {
  static get<T>(url: string, config?: AxiosRequestConfig): Promise<ResponseType<T>> {
    return instance.get<null, ResponseType<T>>(url, config)
  }

  static post<T>(url: string, data?: object): Promise<ResponseType<T>> {
    return instance.post<null, ResponseType<T>>(url, data)
  }

  static delete<T>(url: string, data?: object): Promise<ResponseType<T>> {
    return instance.delete<null, ResponseType<T>>(url, data)
  }

  static put<T>(url: string, data?: object): Promise<ResponseType<T>> {
    return instance.put<null, ResponseType<T>>(url, data)
  }
}


http://www.kler.cn/news/308618.html

相关文章:

  • js的书写位置和css的书写位置的区别?为什么要这样写?
  • dedecms(四种webshell姿势)
  • 微服务之间远程调用实现思路
  • pdf文件转图片,base64或保存到本地
  • django 通过地址访问本地文件
  • Java原生HttpURLConnection实现Get、Post、Put和Delete请求完整工具类分享
  • 高级I/O知识分享【5种IO模型 || select || poll】
  • c++概念
  • windows启动jar指定jdk路径
  • 网页本地存储
  • 【C++】list 模拟实现
  • Vscode运行Python无法导入自己编写的包的解决方法
  • 后端开发刷题 | 最长上升子序列
  • odoo14 | 报错:Database backup error: Access Denied
  • MyBatis之手动映射
  • SSL认证解说
  • 个人随想-gpt-o1大模型中推理链的一个落地实现
  • Linux学习记录十四----------线程的创建和回收
  • Leetcode—1184. 公交站间的距离【简单】
  • Linux(CentOS8)服务器安装RabbitMQ
  • Python数据分析工具(一):Requests的用法
  • 游戏中的唯一id生成,防止合服id重复
  • 成功激活mac idea 记录
  • Java封装(面向对象)
  • 104.WEB渗透测试-信息收集-FOFA语法(4)
  • 腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口
  • [go] 命令模式
  • 电信创维光猫DT741超级密码
  • 【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)
  • 文件标识符fd