关于axios
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
使用说明:https://www.kancloud.cn/yunye/axios/234845
特点:
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
vue项目里使用
$ npm install axios -S
src/utils/auth.js
src/request.js
在实际项目中,每个请求可能都需要带一个Token(Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮)。
关于Token的文章:Token 认证的来龙去脉
用户登录后,服务端会把Token传给客户端,这个时候就需要保存它。
使用js-cookie
npm install js-cookie -S
auth.js
import Cookies from 'js-cookie'
const TokenKey = 'vue_admin_template_token'
export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token) {
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)
}
request.js
import axios from 'axios'
//引入mint-ui
import {Indicator,Toast,MessageBox} from 'mint-ui';
import store from '../vuex'
import {getToken} from '@/utils/auth'
// 创建axios实例
const service = axios.create({
baseURL: process.env.BASE_API, // api 的 base_url
timeout: 10000 // 请求超时时间
})
// request拦截器
service.interceptors.request.use(
config => {
Indicator.open({
text: '加载中...',
spinnerType: 'fading-circle'
});
if (store.getters.token) {
config.headers['session_token'] = getToken() // 让每个请求携带自定义token 根据实际情况修改
}
return config
},
error => {
// Do something with request error
console.log(error) // for debug
Promise.reject(error)
}
)
// response 拦截器
service.interceptors.response.use(
response => {
/**
* code为非200是抛错 结合业务进行修改
*/
Indicator.close();
const res = response.data
if (res.code !== "200") {
Toast({
message: res.error,
duration: 1 * 1000,
position: "bottom"
})
// 101:Token 过期了;
if (res.code === "101") {
MessageBox.confirm(
'你已被登出,可以取消继续留在该页面,或者重新登录',
'确定登出', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
store.dispatch('FedLogOut').then(() => {
location.reload() // 为了重新实例化vue-router对象 避免bug
})
})
}
return Promise.reject('error')
} else {
return response.data
}
},
error => {
Indicator.close();
console.log('err' + error) // for debug
Toast({
message: error.message,
type: 'error',
duration: 1 * 1000,
position: "bottom"
})
return Promise.reject(error)
}
)
export default service
在请求或响应被 then 或 catch 处理前拦截它们。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
新建api文件夹,可以将项目中所有请求分模块编写,便于后期维护。
api封装
import request from '@/utils/request'
//登录
export function login(account, password) {
return request({
url: '/login',
method: 'post',
data: {
account,
password
}
})
}
总结
- Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.
- 可以使用Axios拦截器在请求或响应被 then 或 catch 处理前拦截它们,做一些必要的处理。