结合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 showModalDialog模态对话框使用说明
Dec 31 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
Apr 24 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
jquery实现全选功能效果的实现代码
May 05 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
ReactJS实现表单的单选多选和反选的示例
Oct 13 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
js实现简单图片拖拽效果
Feb 22 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判断是否为json格式的方法
2014/03/04 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
Vue实现本地购物车功能
2018/12/05 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
Python实现批量转换文件编码的方法
2015/07/28 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Django中的文件的上传的几种方式
2018/07/23 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
公司联欢晚会主持词
2014/03/22 职场文书
新文化运动的口号
2014/06/21 职场文书
主要领导对照检查材料
2014/08/26 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
同事去世追悼词
2015/06/23 职场文书
培根随笔读书笔记
2015/07/01 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS