结合axios对项目中的api请求进行封装操作


Posted in Javascript onSeptember 21, 2020

痛点:

1. 后端对全部请求的url进行了调整。

2.后端要求给所有的请求头部添加一个token, 或者对请求添加其他全局处理。

3.请求代码直接写在每个页面里, 看起来代码臃肿,不够简练,太难管理。

4.看到请求代码, 不明白该请求是干嘛的,语义化不够明显。 ...

上面列举的是一些常见的问题,如果没对api进行封装,当请求比较多的时候,修改起来欲哭无泪,解决这些问题可以进行以下操作

1.对axios进行二次封装

2.对全部api请求也进行封装

如下是对axios 进行二次封装, 文件名是 network/index.js:

import axios from "axios";
import Cookies from "js-cookie";
// 设置超时时间
const myAxios = axios.create({
 timeout: 5000
});

// 跳转登录页面
function nav2Login() {
 location.href = '/xxxx/login'
}

// 添加一个请求拦截器
myAxios.interceptors.request.use(
 function(config) {
 // Do something before request is sent

 config.headers["token"] = Cookies.get("token") || "";
 return config;
 },
 function(error) {
 // Do something with request error
 return Promise.reject(error);
 }
);

// 添加一个响应拦截器
myAxios.interceptors.response.use(
 function(response) {
 // Do something with response data
 // 这里只是以200 401为示例, 其他状态码可以根据需要自行添加
 if (response.status === 200) {
  return response.data;
 } else if (response.status === 401) {
  nav2Login() 
  return Promise.reject();
 } else {
  return {
  status: 0,
  message: response.data.message
  };
 }
 },
 function(error) {
 // Do something with response error
 return Promise.reject(error);
 }
);

export default myAxios;

下面是对全部的api进行了封装,文件名是 network/api.js:

import axios from "./index.js";

const API = {
 userList: 'api/user/all', // 用户列表
 cityList: 'api/city/all', // 城市列表
};

function Axios(obj) {
 return axios({
 ...obj
 }).catch(e => {
 // 这里兜住error, 从而不影响后续代码执行,避免出现白屏
 return {
  status: 0,
  message: "网络请求异常"
 };
 });
}

// 给函数命名的时候 尽量语义化
function getUserList(params) {
 return Axios({
 url: API.userList,
 method: "post",
 params
 });
}
function getCityList(params) {
 return Axios({
 url: API.cityList,
 method: "get",
 params
 });
}

export default {
 getUserList,
 getCityList,
}

可以把这些请求挂载在一个全局的变量上, 以Vue为例:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import api from "@/network/api.js";
Vue.prototype.$api = api;

new Vue({
 router,
 render: h => h(App)
}).$mount('#app')

Vue项目中使用方法如下:

this.$api.getUserList(obj).then(res => {
 // 处理res
}).catch(err){
 // 处理 err
}

// 或者使用async await 
async getUserList () {
 try {
  const res = await this.$api.getUserList(obj)
  // 处理res
 } catch (err) {
  // 处理err
 }
}

补充知识:Vue项目中对axios进行封装以及api接口请求

对axios进行封装:

/* 定义一个ajax请求函数,并且其返回值: promise对象(异步返回的数据是: response.data) */
import axios from 'axios';
export default function ajax (url, data={}, type='GET') {
 return new Promise(function (resolve, reject) {
 // 执行异步ajax请求
 let promise
 if (type === 'GET') {
  // 准备url query参数数据,
  let dataStr = ''           //数据拼接字符串
  Object.keys(data).forEach(key => {
  dataStr += key + '=' + data[key] + '&'
  })
  if (dataStr !== '') {
  dataStr = dataStr.substring(0, dataStr.lastIndexOf('&'))
  url = url + '?' + dataStr
  }
  // 发送get请求
  promise = axios.get(url)
 } else {
  // 发送post请求
  promise = axios.post(url, data)
 }
 promise.then(function (response) {
  // 成功了调用resolve()
  resolve(response.data)
 }).catch(function (error) {
  //失败了调用reject()
  reject(error)
 })
 })
}

以上这篇结合axios对项目中的api请求进行封装操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JavaScript事件串连执行多个处理过程的方法
Mar 09 Javascript
javascript学习(一)构建自己的JS库
Jan 02 Javascript
JavaScript中的对象的extensible属性介绍
Dec 30 Javascript
JavaScript中的变量定义与储存介绍
Dec 31 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
Aug 17 Javascript
Bootstrap每天必学之按钮
Nov 26 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 Javascript
vue过滤器用法实例分析
Mar 15 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
微信小程序实现打卡签到页面
Sep 21 #Javascript
微信小程序实现签到弹窗动画
Sep 21 #Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 #Javascript
微信小程序实现日历签到
Sep 21 #Javascript
Vue切换Tab动态渲染组件的操作
Sep 21 #Javascript
js实现购物车商品数量加减
Sep 21 #Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 #Javascript
You might like
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
smarty实例教程
2006/11/19 PHP
一些PHP写的小东西
2006/12/06 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
JavaScript 基础问答三
2008/12/03 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python中__call__方法示例分析
2014/10/11 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python用插值法绘制平滑曲线
2021/02/19 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python创建自己的加密货币的示例
2021/03/01 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
质检的岗位职责
2013/11/17 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
岗位职责的构建方法
2014/02/01 职场文书
工程师岗位职责规定
2014/02/26 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python