Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。
安装
npm install axios
创建实例
axios.create({
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: 'https://some-domain.com/api/',
// `timeout` 指定请求超时的毫秒数。
// 如果请求时间超过 `timeout` 的值,则请求会被中断
timeout: 1000, // 默认值是 `0` (永不超时)
// 自定义请求头
headers: {'X-Custom-Header': 'foobar'}
})
// 给axios设置一些默认行为
switch (process.env.NODE_ENV) {
case 'production':
axios.defaults.baseURL = 'http://47.96.0.211:3001/admin';
break;
case 'development':
axios.defaults.baseURL = 'http://47.96.0.211:3001/admin';
break;
}
// 设置超时时间
axios.defaults.timeout = 5000;
// 设置跨域是否需要携带凭证
axios.defaults.withCredentials = false
发起请求
导入axios
import axios from 'axios'
get请求
axios.get(url,{
params:{
// k:v
},
headers:{
// k:v
}
}).then(res=>{
console.log(res)
}).catch(err=>{
console.log(err)
}).finally(()=>{
// 总是会执行
})
post请求
axios.post(url,{
data:{
// k:v
},
headers:{
// k:v
}
}).then(res=>{
console.log(res)
}).catch(err=>{
console.log(err)
}).finally(()=>{
// 总是会执行
})
async/await写法
async function getUser() {
try {
const response = await axios.get('/user?ID=12345');
console.log(response);
} catch (error) {
console.error(error);
}
}
这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 GET 方法。
拦截器
请求拦截
axios.interceptors.request.use(config=>{
// 需要再请求头上面统一携带token给后端传递
const token = localStorage.getItem('token')
if(token) config.headers.token = token
return config
})
响应拦截
axios.interceptors.response.use(response=>{
// 将后端返回的token令牌存储到本地中
if(response.data?.data?.token) {
localStorage.setItem('token', response.data.data.token)
}
// 如果token失效了,需要跳转到登录页。"code": "10119"
if(response.data.code === '10119'){
localStorage.removeItem('token')
router.push('/login')
}
ElMessage({ // 不需要引入,自动就可以使用了
message: response?.data?.message,
type: response.data.code === '200' ? 'success' : 'error',
})
return response.data
})
封装请求头
import axios from "axios";
import { message } from 'antd';
// 创建axios实例对象
const instance = axios.create({
// 判断环境变量是否为开发环境
baseURL: process.env.NODE_ENV === 'development' ? 'http://47.96.0.211:3001/admin' : 'http://47.96.0.211:3001/admin'
})
// 请求拦截器
instance.interceptors.request.use(config => {
return config
})
// 响应拦截器
instance.interceptors.response.use(response => {
message.open({
type: response.data.code === '200' ? 'success' : 'error',
content: response.data.message
})
return response
})
// 后续借助这个request请求实现get/post相关的接口调用
export default function request(config) {
const { url = '', method = 'GET', data = {}, headers = {} } = config
switch (method.toUpperCase()) {
case 'GET':
return instance.get(url, { params: data })
case 'POST':
// 如果是表单提交
if (headers['content-type'] === 'application/x-www-form-url-encoded') {
const p = new URLSearchParams()
for (const key in data) {
p.append(key, data[key])
}
return instance.post(url, p, { headers })
}
// 如果是文件提交
if (headers['content-type'] === 'multipart/form-data') {
const p = new FormData()
for (const key in data) {
p.append(key, data[key])
}
return instance.post(url, p, { headers })
}
// 否则就是 application/json的形式
return instance.post(url, data)
default:
return instance(config)
}
}