vue项目中对axios进行二次封装
在进行vue项目开发的时候,对axios进行二次封装和对api接口进行模块化的管理
vue项目开发对axios的进行二次封装
前言
在进行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的二次封装一般公司都已经完成,但是基本的原理和思想与这个封装如出一辙,可以学习封装的思想和模块化的思想
更多推荐
所有评论(0)