基于Axios的封装和请求接口的管理
0 点赞
0 条评论
2072 次浏览
发布于 2022-04-02 10:30
安装Axios
npm i axios -S
开始编码
// request.js
/**
* @intro: http统一封装.
*/
import axios from 'axios';
/**
* 判断是否是 FormData
* @param formData
* @returns {boolean}
*/
const isFormData = (formData) => !!formData && Object.prototype.toString.call(formData) === '[object FormData]';
/**
* 是否是表单数据格式化
* @param d
* @returns {boolean}
*/
const isFormScheme = (d) => typeof d === 'string' && /([^&?]*)=([^&?]*)/i.test(d);
/**
* 判断接口返回的code是否正确
* @param code 接口返回的code
* @returns {boolean}
*/
const judgeCode = (code) => /^0$/.test(code);
/**
* 判断接口返回的code是否未登录
* @param code 接口返回的code
* @returns {boolean}
*/
const judgeUnLoginCode = (code) => /^-100$/.test(code);
const service = axios.create({
// 设置全局默认的headers
headers: {
'Content-Type': 'application/json',
},
// 设置请求超时设置
timeout: 30000,
responseType: 'json',
// 请求转换
transformRequest: [
(data, headers) => {
// 这里可以在请求头中增加token,如果后台是jwt这种鉴权的话
const { token } = 用户token对象;
// eslint-disable-next-line no-param-reassign
if (token && !headers.Authorization) headers.Authorization = `Bearer ${token}`;
// 表单上传
if (isFormData(data)) return data;
// 普通表单
if (isFormScheme(data)) {
headers['Content-Type'] = 'application/x-www-form-urlencoded';
return data;
}
return JSON.stringify(data);
},
],
});
// response拦截
service.interceptors.response.use(
(response) => {
const { data } = response;
const resCode = data?.code;
// 请求成功
if (judgeCode(resCode)) return data;
// 未登录
if (judgeUnLoginCode(resCode)) {
// 未登录执行操作
}
// 返回统一格式
return Promise.reject({
...data,
type: 'business',
});
},
(err) => {
const resError = err.response || {};
const { data } = resError;
if (data && typeof data === 'string') {
// 返回统一格式
return Promise.reject({
code: resError.status || '500',
message: data,
type: 'business',
});
}
// 返回统一格式
return Promise.reject({
code: resError.status || '500',
message: err.message || 'System Busy!',
type: 'system',
});
},
);
export default service;
使用
// 新增
export const addUser = (data) => request.post('/user/add', data);
// 删除
export const deleteUser = (data) => request.delete('/user/deleted', data);
// 修改
export const updateUser = (data) => request.put('/user/update', data);
// 查询
export const getUserList = (params) => request.get('/user/list', {params});
说明
如果是get请求直接将参数放进config中,比如:
request.get('/user/list', {params});
如果是form表单提交方式需要将data序列化,比如:
export const addUser = (data) => request.post('/user/add', qs.stringify(data));
如果是form表单上传方式需要将数据转成FormData类型,比如:
/**
* 对象转formData对象
* @param obj 对象
* @returns {FormData}
*/
const object2FormData = (obj = {}) => {
const fd = new FormData();
Object.keys(obj).forEach((key) => {
fd.append(key, obj[key]);
});
return fd;
};
// 上传接口
export const upload = (data) => request.post('/upload', object2FormData(data));
数据都为一对象
"赞助我们,我们才能做的更多&更好"
赞助支持
还没有评论
写下你的评论...
最热文章
使用dart-sass替换node-sass
5192 浏览 · 0 评论
浏览器后退跳转到指定的页面
3867 浏览 · 0 评论
好玩的CSS3(3)-- 翻转(旋转正反两张)图片
3860 浏览 · 0 评论
Flutter适配夜间模式
3611 浏览 · 0 评论
pc端常用电脑屏幕分辨率尺寸适配
3571 浏览 · 0 评论
最新文章
js通过扫码枪快速录入的实现
406 浏览 · 0 评论
使用 WebSocket 实现你画我猜实时绘图
746 浏览 · 0 评论
基于code-server部署自己的云端vscode
2872 浏览 · 0 评论
支付宝动态收款码生成自定义金额及备注
2864 浏览 · 0 评论
使用 nohup 命令将程序挂载在后台执行
1960 浏览 · 0 评论
基于OpenLayers实现离线地图
2802 浏览 · 0 评论