前言

在进行Vue项目或者React项目开发的时候,我们都需要进行很重要的工作,就是向后端发请求获取数据,所以为了能够更加灵活和便捷的发送请求,在开发之前一般会对axios进行二次封装,在进行封装之前,还是进行简单的axios了解


一、axios是什么?

  • axios是目前前端最流行的ajax请求库
  • 它是一款基于Promise异步请求库
  • 可以同时运用在前端以及后台
  • 最重要的是它具有请求拦截器响应拦截器

二、封装步骤

1.下载axios

yarn add axios -S
or
npm i axios -S

2.创建文件

为了便于后期的开发和维护,我们一般将请求相关的文件都会放在同一个文件夹当中,在项目开发的过程中,一般会先建立一个api文件夹,里面放置二次封装后的axios和后台的请求接口。在api文件夹里,创建一个文件http.js,对于二次封装的axios都书写在里面

2.1 http.js文件中引入axios

// 引入axios
import axios from 'axios'

2.2 配置接口的默认地址

项目的运行有三个环境,分别是开发环境、测试环境和生产环境,针对不同的环境,我们使用的默认地址可能会有所差异,所以我们需要根据环境变量区分接口的默认地址,所以我们需要结合package.json进行配置
http.js

// 引入axios
import axios from 'axios'

// 根据环境变量区分接口的默认地址
switch (process.env.NODE_ENV) {
    case "production":
        // 生产环境
        axios.defults.baseURL = "http://api.baidu.com.cn"
        break;
    case "test":
        // 测试环境
        axios.defults.baseURL = "http://192.168.20.12:8080"
        break;
    default:
        // 开发环境
        axios.defults.baseURL = "http://127.0.0.1:8000"
}

package.json

"scripts": {
    "serve": "vue-cli-service serve",
    "serve:test": "set NODE_ENV=test&&vue-cli-service serve",
    "serve:production": "set NODE_ENV=production&&vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },

配置完成之后,当我们在终端运行不同的命令时,就能够匹配到对应的环境地址,完成了对接口地址的封装

2.3 设置超时时间

在发送请求的时候,会遇到网络波动的问题,导致请求迟迟不能返回,所以我们对axios进行配置请求超时时间,能够提高用户的体验

// 引入axios
import axios from 'axios'
// 安装引入qs
import qs from 'qs'

// 根据环境变量区分接口的默认地址
switch (process.env.NODE_ENV) {
    case "production":
        // 生产环境
        axios.defults.baseURL = "http://api.baidu.com.cn"
        break;
    case "test":
        // 测试环境
        axios.defults.baseURL = "http://192.168.20.12:8080"
        break;
    default:
        // 开发环境
        axios.defults.baseURL = "http://127.0.0.1:8000"
}

// 设置超时时间
axios.defults.timeout = 10000;

2.4 配置跨域携带cookie

发送请求的时候,如果需要默认携带cookie,我们可以通过配置withCredentials,可以让请求自动携带凭证

// 是否允许跨域携带凭证
axios.defults.withCredentials = true

2.5 配置请求传递数据的格式

在进行前后台交互的时候,前端通常需要携带一些参数向后台发送请求,所以我们通常要知道后端需要什么样的数据格式,从而在前端请求头中进行相应格式的配置
json格式

// 设置请求传递数据的格式 json
axios.defults.header['Content-Type'] = 'application/json '

x-www-form-urlencoded格式

// 设置请求传递数据的格式 x-www-form-urlencoded 
axios.defults.header['Content-Type'] = 'application/x-www-form-urlencoded'

除了在请求头中配置之外,我们还需要对请求体中的数据进行处理,例如在进行post请求的时候,axios默认会将我们的请求体数据转化成json格式,所以如果后台需要的数据为json格式,可以不进行配置,但是如果后台需要urlencoded格式的数据,则需要借助qs来快速帮助我们进行转码
下载qs

yarn add qs -S
or
npm i qs -S

http.js引入

// 安装引入qs
import qs from 'qs'

配置

// 将post的请求体转化成x-www-form-urlencoded格式
axios.defults.transformRequest = data => qs.stringify(data)

2.6 配置请求拦截器

在使用请求拦截器时,最常用的就是处理token,可以在请求拦截器中,获取到token,并且携带给后端

// 请求拦截器
axios.interceptors.request.use(config => {
    // 获取到token
    let token = localStorage.getItem('token')
    token && (config.headers.Authorization = token)
    return config
}, error => {
    return Promise.reject(error)
})

2.7 配置响应拦截器

响应拦截器中,一般是对后端发送的数据进行一些操作,我们可以根据后端返回的状态码,结合vue-router```进行路由的切换,例如后端返回404``的时候,可以在响应拦截器中切换到404页面

// 响应拦截器
axios.interceptors.response.use(response => {
    return response.data
}, error => {
    let { response } = error
    if (response) {
        // 服务器返回结果
        switch (response.status) {
            // 当前请求需要用户验证(一般是未登录)
            case 401:
                break;
            // 服务器已经理解请求,但是拒绝执行它(一般是token过期)
            case 403:
                break;
            // 找不到页面
            case 404:
                break;
        }
    } else {
        // 服务器没有返回结果
        if (!window.navigator.onLine) {
            // 断网处理:可以跳转到断网页面
            return
        }
        return Promise.reject(error)
    }
})

2.8 对外暴露axios实例

这一步是新手容易犯错的地方,忘记暴露axios实例,导致后续请求无法发送成功

export default axios;

三、api模块化

在项目开发的过程中,往往会有很多的请求接口,如果我们都将接口写在同一个文件,不利于我们的后期开发和维护,所以,对于api我们采用模块化的方式进行分类管理,这样有利于后期维护。
在api文件夹下创建一个index.js文件和module文件夹,index.js文件就是模块化的中心,我们将所有的api有关的模块最终都聚集到index.js文件当中。在module文件夹下创建home.js模块,代表home页面的相关api。

// 引入axios
import axios from '../http'

// 获取页面数据的接口
function getData() {
    return axios.get('/getData')
}

export default {
    getData
}

再创建一个search.js代表search页面相关的api

// 引入axios
import axios from '../http'

// 搜索商品的接口
function searchData() {
    return axios.post('/searchData', {
        itemId: '001'
    })
}

export default {
    searchData
}

接下来就需要将两个api文件引入到我们的index.js文件当中

// 这里数据请求的唯一入口
import home from './module/home'
import search from './module/search'

export default {
    home,
    search
}

为了方便我们之后开发便捷的发送请求,所以我们可以将index.js文件引入到main.js当中,并且挂载到vue的原型

import Vue from 'vue'
import App from './App.vue'
// 在Vue入口文件当中引入api入口文件
import api from './index'

Vue.config.productionTip = false
// 将api挂载到Vue原型上
Vue.prototype.$api = api


new Vue({
    render: h => h(App)
}).$mount('#app')

当我们在组件内发请求的时候,只需要直接调用即可,不用引入别的相关请求

<template>
  <div class="app">axios二次封装</div>
</template>

<script>
export default {
    methods:{
        getData(){
            this.$api.getData()
        }
    }
};
</script>

总结

以上就是在vue项目中对axios进行的二次封装,通过二次封装,可以让我们更加编辑的发送请求,并且采用了模块化的api管理,也便于了后期的维护,但是在实际的工作当中,axios的二次封装一般公司都已经完成,但是基本的原理和思想与这个封装如出一辙,可以学习封装的思想和模块化的思想

Logo

前往低代码交流专区

更多推荐