结合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 相关文章推荐
url 特殊字符 传递参数解决方法
Jan 01 Javascript
js将控件隐藏及display属性的使用介绍
Dec 30 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
javascript实现五星评分功能
Nov 10 Javascript
js编写三级联动简单案例
Dec 21 Javascript
bootstrap weebox 支持ajax的模态弹出框
Feb 23 Javascript
基于Vue2.X的路由和钩子函数详解
Feb 09 Javascript
对Angular中单向数据流的深入理解
Mar 31 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
layui的数据表格+springmvc实现搜索功能的例子
Sep 28 Javascript
浅谈 JavaScript 沙箱Sandbox
Nov 02 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实现链结人气统计
2006/10/09 PHP
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
8个PHP数组面试题
2015/06/23 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python struct.unpack
2008/09/06 Python
Python的另外几种语言实现
2015/01/29 Python
详解Python 函数如何重载?
2019/04/23 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
如何通过命令行进入python
2020/07/06 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
JAVA和C++的区别
2013/10/06 面试题
linux面试题参考答案(7)
2014/07/24 面试题
副校长2015年教育教学工作总结
2015/07/27 职场文书
python实现简单倒计时功能
2021/04/21 Python