vue项目常用之二:封装 axios 请求模块

/**
 * 封装 axios 请求模块
 */
import axios from ‘axios‘
import jsonBig from ‘json-bigint‘
import store from ‘@/store‘
import router from ‘@/router‘
import { Notify } from ‘vant‘

// axios.create 方法:复制一个 axios
const request = axios.create({
  baseURL: ‘http://ttapi.research.itcast.cn/‘ // 基础路径
})

/**
 * 配置处理后端返回数据中超出 js 安全整数范围问题
 */
request.defaults.transformResponse = [function (data) {
  try {
    return jsonBig.parse(data)
  } catch (err) {
    return {}
  }
}]

// 请求拦截器
request.interceptors.request.use(
  function (config) {
    const user = store.state.user
    if (user) {
      config.headers.Authorization = `Bearer ${user.token}`
    }
    // Do something before request is sent
    return config
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  // 响应成功进入第1个函数
  // 该函数的参数是响应对象
  function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    return response
  },
  // 响应失败进入第2个函数,该函数的参数是错误对象
  async function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    // 如果响应码是 401 ,则请求获取新的 token

    // 响应拦截器中的 error 就是那个响应的错误对象
    if (error.response && error.response.status === 401) {
      // 校验是否有 refresh_token
      const user = store.state.user

      if (!user || !user.refresh_token) {
        // router.push(‘/login‘)
        redirectLogin()

        // 代码不要往后执行了
        return
      }

      // 如果有refresh_token,则请求获取新的 token
      try {
        const res = await axios({
          method: ‘PUT‘,
          url: ‘http://ttapi.research.itcast.cn/app/v1_0/authorizations‘,
          headers: {
            Authorization: `Bearer ${user.refresh_token}`
          }
        })

        // 如果获取成功,则把新的 token 更新到容器中
        console.log(‘刷新 token  成功‘, res)
        store.commit(‘setUser‘, {
          token: res.data.data.token, // 最新获取的可用 token
          refresh_token: user.refresh_token // 还是原来的 refresh_token
        })

        // 把之前失败的用户请求继续发出去
        // config 是一个对象,其中包含本次失败请求相关的那些配置信息,例如 url、method 都有
        // return 把 request 的请求结果继续返回给发请求的具体位置
        return request(error.config)
      } catch (err) {
        // 如果获取失败,直接跳转 登录页
        console.log(‘请求刷线 token 失败‘, err)
        // router.push(‘/login‘)
        redirectLogin()
      }
    } else if (error.response.status === 500) {
      Notify(‘服务端异常,请稍后重试‘)
    }

    return Promise.reject(error)
  }
)

function redirectLogin () {
  // router.currentRoute 当前路由对象,和你在组件中访问的 this.$route 是同一个东西
  router.push(‘/login?redirect=‘ + router.currentRoute.fullPath)
}

export default request

原文地址:https://www.cnblogs.com/wtsx-2019/p/12546049.html

时间: 2024-07-29 23:33:36

vue项目常用之二:封装 axios 请求模块的相关文章

vue项目使用async await 封装 axios

es8的async await让异步变成了同步的写法,在vue中,可以通过封装axios,使得所有的请求都可以使用同步的写法. 新建一个api.js文件,全局创建api实例 import axios from 'axios' const qs = require('qs') const api = { async get (url, data) { try { let res = await axios.get(url, {params: data}) res = res.data return

封装axios请求

参照这个封装api的代码   可以了解base的问题了 再加上对`${base/login}`的了解   下面 封装axios请求  以供调用 let base = '' export const requestLogin = params => { return axios.post(`${base}/login`, params).then(res => res.data) } export const reqSaveUserProfile = params => { return

VUE中常用的几种import(模块、文件)引入方式

VUE中常用的几种import(模块.文件)引入方式:https://blog.csdn.net/weixin_38930535/article/details/80177445 1.引入js文件 在用的那一页,引入文件 相应的js文件里面,必须是暴露出来的 2.引入组件 3.引入外部组件 4.引入外部js插件 原文地址:https://www.cnblogs.com/bydzhangxiaowei/p/12237156.html

vue中用qs传参发送axios请求

方法一: 首先在npm中安装: npm install qs 然后再项目中引入 import qs from 'qs' 然后我们发送Axios的时候就可以使用qs.stringify了 axios.post('http://192.168.33.10:8009/api/token',        qs.stringify({        email: email,        password: pass,      }))      .then(function (response) {

封装 axios 请求 并 return 结果

axios请求是异步请求,我遇到的情况是多个请求用同一个地址,通过传参不同控制想要的返回结果,因此,这时想将axios请求封装为一个函数,通过return将返回结果传出来. 但是如何实现呢,我才用的方法如下: queryData(参数..){ var datas={ 定义请求参数.. } return axios.post(this.url,datas).then(response=>response.data.result).catch(error => error) }, 这里的返回值为p

vue项目条形码和二维码生成工具试用

项目开发需要,优惠券分不同类型,简单的使用id生成条形码供店铺使用,麻烦点的需要多个字段的就需要使用二维码来展示了,对应的效果如下 条形码(一维码)使用工具code128 需引入code128.js 和对应的 code123.css, 具体代码可以看 https://www.jb51.net/article/103472.htm 由于项目是vue开发,所以code128.js 稍微改一下,export 出createBarcode接口 export default function create

vue项目常用之三:window.localStorage持久化存储数据封装

export const setItem = (name, value) => { if (typeof value === 'object') { value = JSON.stringify(value) } window.localStorage.setItem(name, value) } export const getItem = name => { const data = window.localStorage.getItem(name) try { return JSON.p

微信小程序开发——使用promise封装异步请求

前言: 有在学vue的网友问如何封装网络请求,这里以正在写的小程序为例,做一个小程序的请求封装. 关于小程序发起 HTTPS 网络请求的Api,详情可以参考官方文档:wx.request(Object object). 如果直接使用官方提供的个Api,那么每次在进行网络请求调用时,我们都要按官方文档上说的那样传递需要设置的请求参数,然后对不同的请求相应结果做不同的处理.但是前端同服务器端的接口请求中有大部分的请求参数以及响应结果处理都是很类似的,也就没有必要对所有请求代码都重新敲敲一遍,那么对原

step by step教你常用JS方法封装(一) [ 大杂烩 ]

本文参考原文-http://bjbsair.com/2020-03-25/tech-info/6338/ 持续更新中... 常用JS方法封装方法预告: 项目常用JS方法封装(二) [ 时间处理 ] 项目常用JS方法封装(三) [ 字符串相关处理 ] 项目常用JS方法封装(四) [ 数组相关处理 ] 使用方法非常简单,只需放到你的 utils.js 工具文件中,直接 export const 加上我的封装方法,在别的文件中使用{方法1,方法2,方法3...}引用后就可以直接使用了! 001.输入一