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文档结合项目开发以及简化优化项目开发!最后感谢大家的支持!!!

相关推荐
hudie76522 分钟前
LikeShop 二开最常改的 5 个文件(附改前改后对比)
前端·uni-app·php·个人开发
qetfw1 小时前
Bash 函数与流程控制:read、if、for、case 验证
linux·前端·javascript·bash
jason.zeng@15022071 小时前
Nginx 配置详解(静态 HTML、下载目录、API 反向代理三套场景)
java·vue.js·1024程序员节
鬼手点金1 小时前
从 API 消息到模型 Token:Chat Template
java·前端·javascript·数据库·人工智能·深度学习·1024程序员节
Shadow(⊙o⊙)1 小时前
LangChain 自定义工具全解析:从 @tool 到 bind_tools 的完整调用链路
java·服务器·前端·1024程序员节
小poop2 小时前
HTML 基础入门:从结构到常用标签详解
前端
jiangliushi62 小时前
GPT-6.1 Sol 免费用:PowerShell 装 Codex 报“禁止运行脚本 npm.ps1”?一条命令解决
前端·gpt·npm
计算机魔术师2 小时前
日均500万亿词元,国内推理速度翻倍却仍落后国外——差距卡在哪
前端
excel2 小时前
用 Node.js 搭建一套可持续获客的 SEO 内容系统:前端工程师 30 天实战方案
前端·后端
yma162 小时前
从零搭建 P2P 聊天室:yma16.cloud 在线工具实战
前端·1024程序员节