GoodNight

Take A Rest

Vue中Axios的封装

Axios简介

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

特性

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

详细信息可以查看axios文档

安装Axios

npm install axios; // 安装axios

封装Axios

我在项目的src目录下,新建了一个request文件夹,当中建了文件http.js

引入

这里肯定是需要引入Axios的,但vue的引入根据需求,因为我的token是根据Vue.prototype.$keycloak全局设定获取的。

import axios from 'axios'
import Vue from 'vue'

创建示例+固定信息设置

// 创建axios实例
let instance = axios.create({ timeout: 1000 * 12 })

// 设置默认请求地址
instance.defaults.baseURL = process.env.VUE_APP_API_URL

请求拦截器

因为该项目使用的是keycloak作为审核登陆系统。所以这边的token是通过我在项目中全局设置的keycloak获取的token

请求头内容,根据各自需要设置。

// 请求拦截器,每次请求前,如果存在token,ip则在请求头中携带token,ip
instance.interceptors.request.use(

config => {
// 请求头加上token,ip
const ip = localStorage.getItem('dh-ip')
const token = Vue.prototype.$keycloak.token

ip && (config.headers['X-Forwarded-For'] = ip)
token && (config.headers.Authorization = 'Bearer ' + token)

return config
},
error => Promise.error(error)

)

这里的&&的使用,如果不清楚什么意思的话,可以看看我之前写的逻辑运算符 && / || / !

响应拦截器

根据服务器返回状态码,判断请求是否报错。

这里写了一个根据状态码,采取不同操作的函数。

/** 
* 请求失败后的错误统一处理
* @param {Number} status 请求失败的状态码
*/
function errorHandle (status, other) {
// 状态码判断
switch (status) {
// 401: token过期,删除缓存,并刷新页面
case 401:
localStorage.removeItem('dh-token')
localStorage.removeItem('dh-refresh-token')
window.location.reload()
break;
// 403: ACCESS_DENIED 权限不够
case 403:
console.log('权限不足')
break;
// 404请求不存在
case 404:
console.log('请求的资源不存在');
break;
default:
console.log(other);
}
}
// 响应拦截器,根据状态码进行一些统一的操作
instance.interceptors.response.use(
// 请求成功
res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
// 请求失败
error => {
console.log(error)
const { response } = error;
if (response) {
// 请求已发出,但是不在2xx的范围
errorHandle(response.status, response.data.message)
return Promise.reject(response)

} else {
// TODO 处理断网的情况
// eg:请求超时或断网时,更新state的network状态
// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
console.log('断网:' + error)
}
}
)

最后输出

export default instance

代码

import axios from 'axios'
import Vue from 'vue'

/**
* 请求失败后的错误统一处理
* @param {Number} status 请求失败的状态码
*/
function errorHandle (status, other) {
// 状态码判断
switch (status) {
// 401: token过期,删除缓存,并刷新页面
case 401:
localStorage.removeItem('dh-token')
localStorage.removeItem('dh-refresh-token')
window.location.reload()
break;
// 403: ACCESS_DENIED 权限不够
case 403:
console.log('权限不足')
break;
// 404请求不存在
case 404:
console.log('请求的资源不存在');
break;
default:
console.log(other);
}
}

// 创建axios实例
let instance = axios.create({ timeout: 1000 * 12 })

// 设置默认请求地址
instance.defaults.baseURL = process.env.VUE_APP_API_URL

// 请求拦截器,每次请求前,如果存在token,ip则在请求头中携带token,ip
instance.interceptors.request.use(

config => {
// 请求头加上token,ip
const ip = localStorage.getItem('dh-ip')
const token = Vue.prototype.$keycloak.token

ip && (config.headers['X-Forwarded-For'] = ip)
token && (config.headers.Authorization = 'Bearer ' + token)

return config
},
error => Promise.error(error)

)

// 响应拦截器,根据状态码进行一些统一的操作
instance.interceptors.response.use(
// 请求成功
res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
// 请求失败
error => {
console.log(error)
const { response } = error;
if (response) {
// 请求已发出,但是不在2xx的范围
errorHandle(response.status, response.data.message)
return Promise.reject(response)

} else {
// TODO 处理断网的情况
// eg:请求超时或断网时,更新state的network状态
// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
// 关于断网组件中的刷新重新获取数据,会在断网组件中说明
console.log('断网:' + error)
}
}
)

export default instance

参考链接

掘金–vue中Axios的封装和API接口的管理

axios中文文档


写文不易,如需转载,请注明出处。

注意文章编写时间,一切以官方文档为主。

如果某处写的有问题,欢迎发邮件,一起交流讨论,共同进步。