结合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 日期转换成中文格式的函数
Jul 07 Javascript
javascript hashtable 修正版 下载
Dec 30 Javascript
最新28个很棒的jQuery 教程
May 28 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
Jul 10 Javascript
JS求平均值的小例子
Nov 29 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
JavaScript设计模式开发中组合模式的使用教程
May 18 Javascript
js实现漫天星星效果
Jan 19 Javascript
ES6之模版字符串的具体使用
May 17 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
Vue封装Axios请求和拦截器的步骤
Sep 16 Javascript
Openlayers绘制地图标注
Sep 28 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调用Google translate_tts api实现代码
2013/08/07 PHP
PHP合并静态文件详解
2014/11/14 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JqGrid web打印实现代码
2011/05/31 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
python获取list下标及其值的简单方法
2016/09/12 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
python3 logging日志封装实例
2020/04/08 Python
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
实体的生命周期
2013/08/31 面试题
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
计算机专业推荐信范文
2013/11/20 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
离婚协议书格式
2015/01/26 职场文书
上班旷工检讨书
2015/08/15 职场文书
Promise静态四兄弟实现示例详解
2022/07/07 Javascript