axios封装处理(含携带token请求,token过期处理,请求数据中的大数处理问题)

axios封装处理(含携带token请求,token过期处理,请求数据中的大数处理问题)

目标:基于axios封装一个请求模块,调用接口时使用

(1) 安装 axios

npm i axios

(2) 新建 src/utils/request.js 模块

import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 超时处理 和 公共路径
const instance = axios.create({
  baseURL: '这里写地址',
  timeout: 5000
})
// 全局注入token
/**
 * 请求拦截器配置   一般用于给请求头设置token
 *     1. 获取token   我这里是存储在Vuex中  const { token } = store.state.user.profile
 *     2. 携带token   if (token) config.headers.Authorization = `Bearer ${token}`
 *     3. 一定要 return config  要不请求就不会发送
 */
instance.interceptors.request.use(config => {
  // 1. 获取 Vuex 中的 token
  const { token } = store.state.user.profile
  // 2. 给请求头携带token
  if (token) config.headers.Authorization = `Bearer ${token}`
  // 一定要return出去
  return config
}, e => Promise.reject(e))

// token失效跳回到登录页
/**
 *  响应拦截器   判断token失效  退出到登录页或者重新获取token
 */

instance.interceptors.response.use(res => res.data, e => {
  // 判断状态吗是401的时候
  if (e?.response?.status === 401) {
    // 获取到地址栏的路径   encodeURLComponent() 编码
    const redirectUrl = encodeURIComponent(router.currentRoute.value.fullPath)
    // 跳转到登录页   后面拼接的路径是为了登录之后跳转到   之前的页面
    router.push('/login?redirectUrl=' + redirectUrl)
  }
  return Promise.reject(e)
})

const request = (url, method, reData) => {
  return instance({
    url,
    method,
    // 对象的key可以写成数组的形式  []  里面可以写一些简单的表达式 和  函数的调用
    [method === 'get' ? 'params' : 'data']: reData
  })
}

export default request

(3) 创建api处理

// 定义首页需要的接口函数
import request from '@/utils/request'
/**
 * @description: 获取导航数据
 * @param {*}
 * @return {*}
 */
export const findHeadCategory = () => {
  return request('/home/category/head', 'get')
}

有数据返回 ,我们的aixos封装完成

如果需要大数处理

大于16位的数字 属于大数 ,会导致 JS 无法正确的进行数字的处理和运算,需要经过处理后才能显示正确

> 1323819148127502300 + 1 === 1323819148127502300 + 2
> true
  1. 下载json-bigint包
yarn add json-bigint
  1. 在request…js中使用, 对后台的数据, 不要让axios自动转成JS对象, 需要用json-bigint转换
const instance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front.itheima.net/',
  timeout: 5000,
  // 在这里进行大数处理
  transformResponse: [function (data) { // 对内容进行处理
    // data:就是本次请求获取的数据
    // 在这里可以对它进行进一步的处理 -- JSONbig
    // 后端返回数据可能不是 JSON 字符串,而JSONbig.parse()只能处理JSON字符串
    // 所以,为了保证代码可以正常执行,这里引入try-catch来捕获异常
    try {
      // 尝试着进行大数的处理
      return bigInt.parse(data)
    } catch {
      // 大数处理失败时的后备方案
      return JSON.parse(data)
    }
  }]
})
  1. 处理完打印记得要转化成字符串
created () {
    console.log(this.obj.art_id.toString())
}

你可能感兴趣的:(axios封装,javascript,vue.js,es6,npm,yarn)