结合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 相关文章推荐
JS 对象介绍
Jan 20 Javascript
YUI Compressor压缩JavaScript原理及微优化
Jan 07 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
js判断鼠标左、中、右键哪个被点击的方法
Jan 27 Javascript
js实现精确到秒的倒计时效果
May 29 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
Apr 28 Javascript
js实现继承的方法及优缺点总结
May 08 Javascript
JS用最简单的方法实现四舍五入
Aug 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
Python读写unicode文件的方法
2015/07/10 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
Python制作词云图代码实例
2019/09/09 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python dict的常用方法示例代码
2020/06/23 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
2013年学期结束动员演讲稿
2014/01/07 职场文书
《雷雨》教学反思
2014/02/20 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS