结合axios对项目中的api请求进行封装操作

 更新时间:2020年09月21日 10:15:16   作者:进军的蜗牛  
这篇文章主要介绍了结合axios对项目中的api请求进行封装操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

痛点:

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请求进行封装操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3+Ts实现父子组件间传值的两种方式

    Vue3+Ts实现父子组件间传值的两种方式

    这篇文章主要给大家介绍了基于Vue3+Ts实现父子组件间传值的两种方式,使用v-model+emit传值和使用v-bind+emit传值两种方式,文章通过代码示例介绍的非常详细,感兴趣的同学可以参考阅读
    2023-09-09
  • vue计算属性想要传入参数如何解决

    vue计算属性想要传入参数如何解决

    这篇文章主要介绍了vue计算属性想要传入参数如何解决问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 浅谈VUE uni-app 模板语法

    浅谈VUE uni-app 模板语法

    这篇文章主要介绍了uni-app 的模板语法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 通过一个简单的例子学会vuex与模块化

    通过一个简单的例子学会vuex与模块化

    这篇文章主要给大家介绍了关于如何通过一个简单的例子学会vuex与模块化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • vue中配置mint-ui报css错误问题的解决方法

    vue中配置mint-ui报css错误问题的解决方法

    本篇文章主要介绍了vue中配置mint-ui报css错误问题的解决方法,非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • vue使用国密SM4进行加密、解密的过程

    vue使用国密SM4进行加密、解密的过程

    国密SM4算法是一种对称加密算法,适用于对称密钥加密和解密的场景,这篇文章主要介绍了vue使用国密SM4进行加密、解密,需要的朋友可以参考下
    2023-07-07
  • vue.js学习笔记之绑定style样式和class列表

    vue.js学习笔记之绑定style样式和class列表

    数据绑定一个常见需求是操作元素的 class 列表和它的内联样式。这篇文章主要介绍了vue.js绑定style和class的相关资料,需要的朋友可以参考下
    2016-10-10
  • Vite+TS+Vue开启eslint和prettier规范及校验方式

    Vite+TS+Vue开启eslint和prettier规范及校验方式

    这篇文章主要介绍了Vite+TS+Vue开启eslint和prettier规范及校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • vue+ElementUI 关闭对话框清空验证,清除form表单的操作

    vue+ElementUI 关闭对话框清空验证,清除form表单的操作

    这篇文章主要介绍了vue+ElementUI 关闭对话框清空验证,清除form表单的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue3系统进入页面前的权限判断和重定向方式

    vue3系统进入页面前的权限判断和重定向方式

    这篇文章主要介绍了vue3系统进入页面前的权限判断和重定向方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论