Vue 封装ajax请求[接口]函数

news2024/11/18 17:38:09

         在Vue项目开发当中,当有了后端提供的数据接口之后呢,就需要来为接口定义接口的请求函数,那么在去定义接口函数之前可以先来封装一个ajax请求函数;可能有的初学者在之前的一些篇目当中看到这个vue发起数据请求的不是使用axios的吗?这个确实没有问题,在封装ajax请求函数模块当中呢同样还是通过axios来发起请求的;下面可以通过代码来更好的理解: 

        创建项目内容省略,在 /src 下创建目录 /src/api 来存放请求接口函数模块 /api/ajax.js 以及各接口请求函数 /api/index.js ;

封装ajax请求函数模块

// 引入axios模块
import axios from 'axios'

        在之前使用过axios的时候,通过 axios.get() / axios.post() 所能拿到的就是 response,而通过封装ajax请求函数是想拿到的是 response.data ,这样一来就能够简化调用;

        理解上面这点下面来看一下请求方式,一般请求方式最常见的就是GET请求,然后就是POST请求了,都知道post请求比get请求安全,get请求会将一些参数显示在url上,而post请求则不然,所以需要来对GET请求做请求url和query参数的拼接;

/* ajax请求函数模块 */

// 引入axios模块
import axios from 'axios'

export default function ajax (url, data = {}, type = 'get') {
    let promise
    if (type === 'GET') {
      // 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)
    }
    return promise
}

[小白注解]:ajax(url ,data = {},type = 'get' ) 中有三个参数,第一个url地址,第二个data = {}  是将参数以对象的形式传过来,第三个type = 'get',即method 请求方式,这里默认为get请求,因为一般的get请求是比较多的 ;axios.get(url) 中url刚好就是以及拼接的url,而axios.post(url,data) 中传递一个url地址和参数对象就可以了;】

        通过请求 axios.get(url) 和 axios.post(url,data) 返回的是一个 promise  ( promise = axios.get/post ),即是一个response,但是想得到的不是一个response,而是response.data ;

await ajax(url ,data = {} ,type = 'GET') 拿到的response
// 走两步
const response = await ajax(...)
const result = response.data

// 一步到位
const result = await ajax(...)

console.log(result)
相当于调用ajax() 这个异步函数就能得到result,而不是先得到response,然后在
通过response.data得到result;

        那怎么来操作拿到想要的 response.data 呢?封装的 ajax() 函数最后返回的是Promise对象,那么就在它的外面在包裹一层 Promise —— new Promise( )

/* ajax请求函数模块 */
// 引入axios模块
import axios from 'axios'

export default function ajax (url, data = {}, type = 'GET') {
  return new Promise(function (resolve, reject) { 
    // 执行异步ajax请求
    let promise
    if (type === 'GET') {
      // 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)
    }
    // return promise
    promise.then(response => {
    // success —— 调用resolve()
      resolve(response.data)
    }).catch((error) => {
      // fail —— 调用reject()
      reject(error)
    })
  })
}

[小白注解]:new Promise () 中传function(resolve,reject){} ,这两个参数resolve和reject参数的类型是函数,没看错就是函数,接收函数的函数叫 "高阶函数" ,接下来在里面来执行异步请求,执行异步ajax请求,成功了success就调用resolve() 函数,即resolve(response.data) ,这次能够拿到的就是response.data而不是response了,失败了fail就调用reject() 函数 ,即reject(error),失败就将错误结果进行返回;通过在axios请求拿到的结果上包裹一层promise来简化外部调用;


封装接口请求函数        

        封装完ajax请求函数模块后,接下来就可以在/api/index.js 文件中来封装接口请求函数,接口请求函数可以查看后端项目中提供的API接口文档:

        这里就来封装一个登录请求的接口函数;首先来看一下这个API接口文档中的内容:

        在 /api/index.js 中封装接口请求函数 —— 登录接口 ,这里的重点是如何来根据API文档来如何封装接口函数:

        导入reqLogin 接口函数( 请求接口函数建议使用 req+[接口名称] );

1 )需不需要传参? API文档中得知两个必要参数 —— username 和 password ;所以是 reqLogin( username,password ) 

export function reqLogin(username, password) {

}

2 )请求接口url?请求方式? API文档中得知请求url ——[ /api /login —— POST请求 ]

export function reqLogin(username, password) {
     ajax('/api/register', ......
}

3 ) 请求参数 ?这里需要注意得是 Content - type (编码格式),有三种提交方式:1. application/json,2. multipart/form-data,3. application/x-www-form-urlencoded,从API文档中得知这个编码格式是 application/x-www-from-urlencoded 

附上一篇关于axios请求编码的内容:请求体编码 | Axios 中文文档 | Axios 中文网

/* 登录注册接口函数 */
// 引入ajax接口请求函数模块
import ajax from './ajax'
import qs from 'qs'

export function reqLogin (username, password) {
  ajax('/api/register', qs.stringify({ username, password }), 'POST')
}

        这样一来可以再进行调整,这个函数导出的是比较简单的,可以用ES6的方式来进行编写:

import ajax from './ajax'
import qs from 'qs'

export const reqRegister = (username, password) => ajax('/api/register', qs.stringify({ username, password }), 'POST')

        两种方式都没有问题,建议采用ES6的这种编写方式:

        最后一步测试一下:在测试之前呢需要做什么呢??跨域。这个在上一篇内容就已经讲过了,在项目初始配置的时候就需要解决跨域的问题,那么如何是为解决跨域问题的可以翻阅上一篇内容,当然这里也会提供跨域的代码,只是如果想了解搞明白的建议学习一下!

4)跨域 —— 反向代理配置 vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,
  devServer: {
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:3000',
        changeOrigin: true
      }

    }
  }
})

5) 在MusicView.vue(首页)文件中发起数据请求:

...
<script>
// 引入封装好的各接口函数
import { reqLogin } from '../api'
export default {
  async mounted () {
    const result = await reqLogin('admin', 'admin')
    console.log(result)
  }
</script>

        可以看到拿到的 result 就是 response.data 的内容了,好以上就是本篇的全部内容了,在项目当中如何来封装ajax请求函数模块和封装各接口请求函数的内容,希望通过此篇能够进一步了解项目当中如何来通过API文档结合项目开发以及简化优化项目开发!最后感谢大家的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.MySQL表的增删改查(基础)

文章目录 ☕️1. CRUD☕️&#x1f375;2. 新增&#xff08;Create&#xff09;&#x1f375;&#x1f37c;2.1 单行数据 全列插入&#x1f37c;&#x1f37a;2.2 多行数据 指定列插入&#x1f37a;&#x1f378;2.3关于时间的插入格式(homework数据表)&#xff1a;&#x1f…

串口RS232、RS485最本质区别

由下图可看出不管是RS232还是RS485&#xff0c;其本质都是串口通信&#xff0c;只不过是串口通信电平上的变种而已。所以&#xff0c;我们首先从串口通信讲起。 1、串口通信 任何一种通信都要有物理接口和通信协议。串口通信物理接口如下图&#xff1a; 串口通信协议首先要约…

RBAC权限管理,Shiro实践

概念介绍 RBAC是指基于角色的访问控制&#xff08;Role-Based Access Control&#xff09;&#xff0c;它是一种广泛应用于计算机安全领域的访问控制机制。RBAC通过将用户分配到不同的角色&#xff0c;来控制用户对系统中资源的访问权限。 在RBAC中&#xff0c;每个角色都被…

LVS-DR群集部署

目录 一、LVS-DR数据包流向分析 二、 DR 模式的特点 总结 三、LVS-DR中的ARP问题 1.在局域网中具有相同的IP地址&#xff0c;势必会造成各服务器ARP通信的紊乱 2.路由器根据ARP表项&#xff0c;会将新来的请求报文转发给RealServer&#xff0c;导致Director的VIP失效 3.解…

openGauss5 企业版之yum方式安装

文章目录 1. 支持的架构和操作系统版本2. 使用限制3. 安装方式4. 使用说明 本章节主要介绍在openEuler 22.03 LTS操作系统上&#xff0c;通过yum命令一键安装openGauss数据库。 1. 支持的架构和操作系统版本 x86-64 openEuler 22.03 LTSARM64 openEuler 22.03 LTS 仅在openEu…

【博学谷学习记录】超强总结,用心分享 | 架构师 Maven学习总结

文章目录 Maven基本1.什么是Maven2.为什么用Maven?&#xff08;1&#xff09;jar 包的规模&#xff08;2&#xff09; jar 包的来源&#xff08;3&#xff09;jar 包之间的依赖关系 3.Maven目录结构4.maven仓库配置 Pom层次Pom文件简介Super POM 依赖管理1 依赖传递2 传递性依…

基于51单片机的智能火灾报警系统温度烟雾光

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;火灾报警 获取完整源码源文件电路图仿真文件论文报告等 功能简介 51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块 具体功能&#xff1a; 1、实时监测及显示温度值和烟雾浓度…

【Docker】docker部署springboot+vue+mysql+nginx前后端分离项目【部署实战篇】

文章目录 0、安装docker并准备一个springboot-vue前后端分离项目前后端打包放到服务器上1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean pac…

【MySQL】一文带你掌握聚合查询和联合查询

文章目录 1. 聚合函数1.1 COUNT1.2 SUM1.3 AVG1.4 MAX&#xff0c;MIN 2. GROUP BY3. HAVING4. 联合查询4.1 内连接4.2 外连接4.3 自连接4.4 子连接 5.合并查询5.1 UNION5.2 UNION ALL 1. 聚合函数 概念&#xff1a; 聚合函数是一种用于处理数据集合的函数&#xff0c;它将多个…

Fiddler 抓包的八个实用技巧,你学会了吗?

目录 前言 1、双击Session时&#xff0c;使响应页始终显示到”json”tab页&#xff1b;使请求页始终显示到“webform”tab页 2、显示每个Session 的请求IP地址 3、修改响应Header中的Content-Type 4、右键session 直接使用浏览器打开url 5、Session列中&#xff0c;显示每…

电脑拷贝到u盘数据丢失原因分析|3种恢复方法

在电脑操作中&#xff0c;经常需要将数据拷贝到U盘中进行备份或传输。但有时候&#xff0c;我们可能会遇到数据在拷贝或传输过程中丢失的情况。这种情况下&#xff0c;我们该如何找回这些丢失的数据呢&#xff1f; 下面&#xff0c;为大家介绍一些恢复U盘数据的方法&#xff0c…

[ICNN 1993] Optimal brain surgeon and general network pruning

Contents IntroductionMethodOptimal brain surgeon (OBS)Computing the inverse HessianThe ( t − o ) → 0 (\mathbf t-\mathbf o)\rightarrow 0 (t−o)→0 Approximation References Introduction 作者提出 Optimal brain damage (OBD) 的改进 Optimal brain surgeon (OB…

霍夫变换(Hough Transform)

文章目录 1. 什么是霍夫变换2. 霍夫直线检测2.1 霍夫直线检测的具体步骤2.2 霍夫直线检测的优缺点2.3 OpenCV中霍夫直线检测的应用2.3.1 标准霍夫检测2.3.2 概率霍夫检测 3. 霍夫圆检测4. 源码仓库地址 1. 什么是霍夫变换 霍夫变换(Hough Transform)是图像处理中的一种特征提取…

Spring Data Redis的使用

Redis的valus值的五种数据类型 问题&#xff1a;Windows下出现Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝&#xff0c;无法连接。 解决方法为在Redis-x64-3.2.100目录下打开两个cmd窗口&#xff0c;分别输入 命令redis-server.exe redis.windows…

【Go知识点】Gorm Hook 无侵入实现 数据表防篡改

一、前言 Hi&#xff0c;开门见山的说&#xff0c;这次给大家带来的是关于 Gorm Hook 机制的落地场景&#xff0c;笔者也是在Gorm官方文档中了解到有Hook机制的存在&#xff0c;不过一直没有找到过太多合适的场景来使用。 最近刚好在做一块新业务的设计&#xff0c;因为涉及到…

PL2303HXA自2012已停产,请联系供货商的解决办法

一、概述 PL2303 是Prolific 公司生产的一种高度集成的接口转换器&#xff0c;可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利连接的解决方案。PL2303具有多个历史版本&#xff0c;早期的版本是PL2303HX, 近年有PL2303HXA、PL2303HXC、PL2303HXD&#xff08;D版本…

SpringCloud01:SpringCloud介绍、服务提供者、服务消费者

SpringCloud和SpringBoot的关系 SpringBoot专注于快速、方便地开发单个个体微服务&#xff0c;SpringCloud关注全局的治理框架&#xff0c;它将SpringBoot开发的一个个单体微服务整合并管理起来&#xff0c;为各个微服务之间提供&#xff1a;管理配置、服务发现、断路器、路由…

GO-slice详解

GO-slice详解 简介 slice&#xff08;切片&#xff09;是go中常见和强大的类型&#xff0c;这篇文章不是slice使用简介&#xff0c;从源码角度来分析slice的实现&#xff0c;slice的一些迷惑的使用方式&#xff0c;同时也讲清楚一些问题。 slice的底层实现是数组&#xff0c…

(转载)基于蚁群算法的三维路径规划(matlab实现)

1 理论基础 1.1 三维路径规划问题概述 三维路径规划指在已知三维地图中&#xff0c;规划出一条从出发点到目标点满足某项指标最优&#xff0c;并且避开了所有三维障碍物的三维最优路径。现有的路径规划算法中&#xff0c;大部分算法是在二维规划平面或准二维规划平面中进行路…

微服务框架

流量入口Nginx 在上图中可以看到&#xff0c;Nginx作为整个架构的流量入口&#xff0c;可以理解为一个外部的网关&#xff0c;它承担着请求的路由转发、负载均衡、动静分离等功能。作为一个核心入口点&#xff0c;Nginx肯定要采用多节点部署&#xff0c;同时通过keepalived来实…