axios二次封装简易版

449 阅读2分钟

axios的官方文档对它是这么介绍的

  • 从浏览器中创建XMLHttpRequest
  • 从node发出http请求
  • 支持Promsie API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防止CSRF/XSRF

安装axios,qs

npm install axios qs  // qs模块,用来序列化post类型的数据

引入

import axios from 'axios'
import qs from 'qs'

process.env.NODE_ENV

  • 一般开发中会有开发环境(development),生产环境(production),测试环境(暂名为test)
  • 可以通过process.env.NODE_ENV来判断当前环境
    • process对象是全局变量,它提供当前node.js的有关信息,以及控制当前node.js的有关进程,对于node应用程序是始终可用的,无需require
    • env自然是它的一个属性,这个属性返回包含用户环境信息的对象
    • NODE_ENV不是process.env对象上原有的属性,是我们自己添加上去的一个环境变量,用来确定当前所处的开发阶段。一般生产阶段设为production,开发阶段设为develop
  • 在终端输入node后,在输入process.env可以看到打印出来的信息

根据环境变量区分接口的默认地址

switch (process.env.NODE_ENV) {
    case "production":
        axios.defaults.baseURL = "http://api.production.com"
        break
    case "test":
        axios.defaults.baseURL = "http://192.168.20.12:8080"
        break
    default:
        axios.defaults.baseURL = "http://127.0.0.1:7000"
}

设置超时时间和跨域是否携带凭证

axios.defaults.timeout = 10000
axios.defaults.withCredentials = true

设置请求传递数据的格式(具体看服务器要求的格式)

axios.defaults.header['Content-Type'] = 'application/x-www-form-urlencoded'

处理post数据

axios.defaults.transformRequest = data => {
    qs.stringify(data)
}

设置请求拦截器

  • Token校验(例如JWT) 接收服务器返回的Token,存储到vux或本地存储中
  • 每一次向服务器发请求,应该把Token带上
axios.interceptors.request.use(
    config => {
        // 携带上Token,以Token存储在localStorage为例
        let token = localStorage.getItem('token')
        token && (config.headers.Authorization = token)
        return config
    },
    error => {
        return Promise.reject(error)
    })

自定义响应成功的HTTP状态码

axios.defaults.validataStatus = status => {
    return /^(2|3)\d{2}$/.test(status)
}

响应拦截器

axios.interceptors.response.use(
    response => {
        return response.data
    },
    error => {
        let { response } = error
        if (response) {
            // 服务器有返回结果
            switch (response.status) {
                case 401: // 当前请求用户需要验证(未登录)
                    // 此处进行相应处理
                    break
                case 403: // 服务器已经理解请求,但是拒绝执行(Token过期)
                    // 此处进行相应处理
                    break
                case 404: // 请求失败, 请求资源未在服务器中找到
                    // 此处进行相应处理
                    break
            }
        } else {
            // 服务器无返回结果
            if (!window.navigator.onLine) {
                // 断网处理
                return
            }
            return Promise.reject(error)
        }
    })

导出

export default axios