vue项目的axios封装
1、初始化axios请求实例
在util里面新建js文件
// 创建 axios 请求实例
const serviceAxios = axios.create({
baseURL: "", // 基础请求地址
timeout: 10000, // 请求超时设置
withCredentials: false, // 跨域请求是否需要携带 cookie
});
2、设置拦截
1、设置请求拦截(serviceAxios.interceptors.request.use)
// 创建请求拦截
serviceAxios.interceptors.request.use(
(config) => {
// 如果开启 token 认证
if (serverConfig.useTokenAuthorization) {
config.headers["Authorization"] = localStorage.getItem("token"); // 请求头携带 token
}
// 设置请求头
if(!config.headers["content-type"]) { // 如果没有设置请求头
if(config.method === 'post') {
config.headers["content-type"] = "application/x-www-form-urlencoded"; // post 请求
config.data = qs.stringify(config.data); // 序列化,比如表单数据
} else {
config.headers["content-type"] = "application/json"; // 默认类型
}
}
console.log("请求配置", config);
return config;
},
(error) => {
Promise.reject(error);
}
);
2、设置响应拦截(serviceAxios.interceptors.response.use)
// 创建响应拦截
serviceAxios.interceptors.response.use(
(response) => {
let data = response.data;
// 处理自己的业务逻辑,比如判断 token 是否过期等等
// 代码块
return data;
},
(error) => {
let message = "";
if (error && error.response) {
switch (error.response.status) {
case 302:
message = "接口重定向了!";
break;
case 400:
message = "参数不正确!";
break;
case 401:
message = "您未登录,或者登录已经超时,请先登录!";
break;
case 403:
message = "您没有权限操作!";
break;
case 404:
message = `请求地址出错: ${error.response.config.url}`;
break;
case 408:
message = "请求超时!";
break;
case 409:
message = "系统已存在相同数据!";
break;
case 500:
message = "服务器内部错误!";
break;
case 501:
message = "服务未实现!";
break;
case 502:
message = "网关错误!";
break;
case 503:
message = "服务不可用!";
break;
case 504:
message = "服务暂时无法访问,请稍后再试!";
break;
case 505:
message = "HTTP 版本不受支持!";
break;
default:
message = "异常问题,请联系管理员!";
break;
}
}
return Promise.reject(message);
}
);
完整代码:
import axios from 'axios'
import serverConfig from './serverConfig.js'
// 序列化操作
import qs from 'qs'
// 创建 axios 实例
const request = axios.create({
// API 请求的默认前缀
baseURL: serverConfig.baseURL,
timeout: 10000, // 请求超时时间
})
// 异常拦截处理器
const errorHandler = (error) => {
console.log('异常处理', error)
let message = ''
if (error && error.response) {
switch (error.response.status) {
case 302:
message = '接口重定向!'
break
case 400:
message = '参数不正确!'
break
case 401:
message = '您未登录,或者登录已经超时,请先登录!'
break
case 403:
message = '您没有权限操作!'
break
case 404:
message = `请求地址出错: ${error.response.config.url}`
break
case 408:
message = '请求超时!'
break
case 409:
message = '系统已存在相同数据!'
break
case 500:
message = '服务器内部错误!'
break
case 501:
message = '服务未实现!'
break
case 502:
message = '网关错误!'
break
case 503:
message = '服务不可用!'
break
case 504:
message = '服务暂时无法访问,请稍后再试!'
break
case 505:
message = 'HTTP 版本不受支持!'
break
default:
message = '异常问题,请联系管理员!'
break
}
}
return Promise.reject(message)
}
// 请求拦截器
request.interceptors.request.use((config) => {
console.log('请求配置', config)
// 设置请求头
if (!config.headers['content-type']) {
// 如果开启 token 认证
if (serverConfig.useTokenAuthorization) {
config.headers['Authorization'] = localStorage.getItem('token') // 请求头携带 token
}
// 如果没有设置请求头
if (config.method === 'post') {
config.headers['content-type'] = 'application/x-www-form-urlencoded' // post 请求
config.data = qs.stringify(config.data) // 序列化,比如表单数据
} else {
config.headers['content-type'] = 'application/json' // 默认类型
}
}
// 需要返回数据
return config
}, errorHandler)
// 响应拦截
request.interceptors.response.use((response) => {
console.log('响应结果', response)
let data = response.data
// 处理自己的业务逻辑,比如判断 token 是否过期等等
// 代码块
return data
}, errorHandler)
export default request
3、设置接口
1、接口
import request from '@/utils/request'
export function getUserInfo (params) {
return request({
url: '/api/website/queryMenuWebsite',
method: 'get',
params
})
}
// post使用data接受
export function login (data) {
return request({
url: '/api/website/login',
method: 'post',
data,
headers: {
// 传表单格式,不传json格式
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
3、使用
(1)引入
import { getUserInfo,login } from "@/api/user"
(2)使用
使用.then或者async处理异步
getUserList () {
const params = {
pmenuId: 11
}
getUserInfo(params).then(res => {
console.log(res)
})
},
async loginAsync () {
let params = {
email: "123",
password: "12321"
}
let data = await login(params);
console.log(data);
}
4、处理请求头
post请求的请求头默认是json格式
注意:post参数需要用data接受
(1)方法一
在每个post接口设置请求头格式为:‘Content-Type’: ‘application/x-www-form-urlencoded’
(2)方法二
在请求拦截器设置请求头
引入qs
npm install qs
// 序列化操作
import qs from 'qs'
qs.parse()和qs.stringify()
qs.parse()是将URL解析成对象的形式
qs.stringify()是将对象 序列化成URL的形式,以&进行拼接
var Lk = {year: '2021',month: '01'};
qs.stringify(LK);
console.log(qs.stringify(LK));
//输出year=2021&month=01
使用qs
借鉴:
作者:小猪课堂
链接:https://juejin.cn/post/7094165971874611230
来源:稀土掘金
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果