结合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 相关文章推荐
Prototype 工具函数 学习
Jul 23 Javascript
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
javascript中关于执行环境的杂谈
Aug 14 Javascript
[原创]推荐10款最热门jQuery UI框架
Aug 19 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
javascript判断并获取注册表中可信任站点的方法
Jun 01 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
Sep 17 Javascript
Bootstrap警告(Alerts)的实现方法
Mar 22 Javascript
详谈commonjs模块与es6模块的区别
Oct 18 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 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
async和DOM Script文件加载比较
2014/07/20 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
对python列表里的字典元素去重方法详解
2019/01/21 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
Python实现括号匹配方法详解
2020/02/10 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
python re.match()用法相关示例
2021/01/27 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
什么是java序列化,如何实现java序列化
2012/11/14 面试题
Python的两道面试题
2013/06/29 面试题
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
详解java如何集成swagger组件
2021/06/21 Java/Android