结合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学习笔记(二) js一些基本概念
Jun 18 Javascript
js动态创建、删除表格示例代码
Aug 07 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
最新最热最实用的15个jQuery插件汇总
Jul 05 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
浅析vue component 组件使用
Mar 06 Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 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
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
原生js实现下拉选项卡
2019/11/27 Javascript
js实现聊天对话框
2020/02/08 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
美德少年事迹材料
2014/01/23 职场文书
教师绩效工资方案
2014/02/01 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
同意迁入证明模板
2014/10/26 职场文书
故宫导游词
2015/01/31 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
2015年工程师工作总结
2015/04/30 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js