结合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小游戏实现代码
Aug 19 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
Jun 26 Javascript
教你用jquery实现iframe自适应高度
Jun 11 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
Sep 14 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
利用Three.js如何实现阴影效果实例代码
Sep 26 Javascript
JavaScript实现精美个性导航栏筋斗云效果
Oct 29 Javascript
Vue数字输入框组件的使用方法
Oct 19 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 Javascript
vue render函数动态加载img的src路径操作
Oct 26 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
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python随机生成彩票号码的方法
2015/03/05 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
临床医学应届生求职信
2013/11/06 职场文书
人事部主管岗位职责
2013/12/26 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
英文商务邀请信
2014/01/22 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
千与千寻观后感
2015/06/04 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android
VUE递归树形实现多级列表
2022/07/15 Vue.js