结合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 相关文章推荐
Jquery 学习笔记(一)
Oct 13 Javascript
Js 刷新框架页的代码
Apr 13 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
Nov 30 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
Sep 02 Javascript
将查询条件的input、select清空
Jan 14 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 Javascript
JavaScript实现简单Tip提示框效果
Apr 20 Javascript
ES6概念 ymbol.for()方法
Dec 25 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
基于bootstrap页面渲染的问题解决方法
Aug 09 Javascript
vue $router和$route的区别详解
Dec 02 Vue.js
微信小程序实现打卡签到页面
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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
JS option location 页面跳转实现代码
2008/12/27 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
Python中input和raw_input的一点区别
2014/10/21 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Python底层封装实现方法详解
2020/01/22 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
python中实现栈的三种方法
2020/12/19 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
Wallis官网:英国女装零售商
2020/01/21 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
投标承诺书范本
2014/03/27 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
仲裁协议书
2014/09/26 职场文书