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

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

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

封装ajax请求函数模块

javascript 复制代码
// 引入axios模块
import axios from 'axios'

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

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

javascript 复制代码
/* 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 ;

javascript 复制代码
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( )

javascript 复制代码
/* 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 )

javascript 复制代码
export function reqLogin(username, password) {

}

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

javascript 复制代码
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 中文网

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

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

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

javascript 复制代码
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

javascript 复制代码
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(首页)文件中发起数据请求:

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

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

相关推荐
LEE32 分钟前
前端转型全栈 03:接口失败也返回 200,OpenAPI 契约与错误码怎么定
前端·后端·全栈
我命由我123451 小时前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
lichenyang4532 小时前
让 VK 小程序调用 HarmonyOS 原生能力:一次跨端 Bridge SDK 的设计与实践
前端
雪芽蓝域zzs2 小时前
第 12 章:一页多图表看板(多 BaseEchart 组件共存,后台首页大屏效果)
vue.js·echars
阳光宅男@李光熠2 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
边境悍匪2 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
南雨北斗2 小时前
vue3项目中的env.d.ts文件
前端
烈风逍遥2 小时前
第五篇:通用 LLM 流式对话:前后端联接的完整实现
前端·后端·架构
aixingpan2 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_progression_sec_transit2接口指南
前端·php
江华森3 小时前
Web 安全实战:验证机制、会话管理、SQL 注入、XSS 与 CSRF
前端