FlyHttp 的设计思想:前端 API 自动化构建工具

news2025/1/11 20:54:01

FlyHttp的相关文章:

FlyHttp 的诞生:从认识各种网络请求开始

FlyHttp 的设计思想:前端 API 自动化构建工具

FlyHttp 的使用:如何高效使用 FlyHttp,支持 JS、TS 项目

FlyHttp 的最佳实践:加速项目级 API 请求构建

讲述 FlyHttp 设计思想

Vue.js 框架为例子,我们简单看一下,在进行项目开发中,使用 axios 在前端进行网络请求,我们需要进行哪些步骤?

1. 传统的开发流程

1.1封装 axios

在我们进行前端项目开发时,封装 axios 是必须的。因为每个项目业务可能都不一样,但是封装思想都是一样的,封装适合自己的 axios,不但可以统一管控自己的请求入口,还能大大节约请求工作量,这其中的好处不言而喻。

直接拿来我自己封装的 axios 核心代码,包括但不限于以下的简单形式:主要是构建实例,请求拦截等。

import axios, { AxiosInstance } from 'axios';

// 配置新建一个 axios 实例
const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 50000,
  headers: { 'Content-Type': 'application/json' },
});

// 添加请求拦截器
request.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么,比如认证token
    if ('token') {
      config.headers!['Authorization'] = 'token';
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    const res = response.data;
    if (res.status && res.status !== 200) {
      return Promise.reject(request.interceptors.response);
    } else {
      return res;
    }
  },
  (error) => {
    // 对响应错误做点什么
    if (error.message.indexOf('timeout') != -1) {
      console.error('网络超时');
    } else if (error.message == 'Network Error') {
      console.error('网络连接错误');
    } else {
      if (error.response.data) console.error(error.response.statusText);
      else console.error('接口路径找不到');
    }
    return Promise.reject(error);
  }
);
1.2 开发请求 API

对以上简单封装后,我们就可以使用封装好的 axios 实例来进行编写请求方法了

import request from '@/utils/request'

// 定义接口地址
const api = {
  useLogin: '/api/user/login', // 用户登录
  useLogout: '/api/user/logout' // 用户登出
  // ...等等还有很多接口地址
}

// 用户登录方法
export function useLogin(data) {
  return request({
    url: api.useLogin,
    method: 'POST',
    data
  })
}

// 用户登出方法
export function useLogout(data) {
  return request({
    url: api.useLogout,
    method: 'POST',
    data
  })
}

// ...等等还有很多方法

页面中使用方式如下:

import api from '@/api'

// 用户登录
api.userLogin(params)
// 用户的登出

通过以上的步骤,我们就实现了传统的、标准化的请求流程,这种请求使用方式是在前端项目中,我认为是最常见的代码书写方式,很简单、很规范、也很好理解,可以说结构特别清晰,我认为完全没有问题!因为我在项目中,大致也是这么使用的。

2 思考如何优化?

通过以上方式的实现,我们我们有没有想过,我们在不断的重复写一些代码,不断重复的写这些 API 声明、API 请求方法!如果是一个庞大的应用,API 有几百个也是有可能的。

试想一下:有多少个 API 地址,我们就会写多少个请求方法。如果将来需要改动,我们也要联动改动。那么在实际开发中可不可以优化呢?这些重复的方法声明可以省略掉吗?(重复的代码我不想写第二遍

因此,本工具的理念就是做这些重复的劳动,我们只需要配置,其他的交给工具就可以了!

2.1 工具雏形

3.1.2 的代码步骤中,其实有一些是可以省略掉的,接口地址的定义属于配置文件,必须声明,因为每一个接口地址都是不同的。但是可以将请求方法的的构建省略,因为它们都具有相似性,可以使用函数将其生成。

基于以上这个思想,就有了该工具库的雏形,如下部分核心代码:

import request from '@/utils/request'

// 定义接口地址
const api = {
  useLogin: '/api/user/login', // 用户登录
  useLogout: '/api/user/logout' // 用户登出
  // ...等等还有很多接口地址
}
const modules = {}

// 写一个函数自动注入
Object.keys(api).forEach(key => {
  modules[key] = function (parameter, config = {}) {
    const url = config.url || api[key]
    const method = config.method || 'get'
    const params = method === 'get' ? parameter : {}
    const data = method === 'get' ? {} : parameter
    return request({ ...{ url, method, params, data }, ...config })
  }
})

export default modules

如下图所示,可以看到,通过运行代码,已经生成了请求类。

页面中使用方式如下:

import api from '@/api'

// 用户登录
api.userLogin(params)
// 用户的登出
api.userLogout()
// 一些开发的参数传递
api.userLogin(params, { method: 'POST' })
2.2 改进思考

其实以上的操作能够节省掉 80% 的代码,至少我们所有的方法声明都不用写,但是同时也有个问题,并不能适用于所有的方式!比如 RESTful 接口形式的请求。

可能有些前端开发对 RESTful 不太了解,这里简单说一下 RESTful 接口形式:

RESTful(Representational State Transfer)是一种基于资源的软件架构风格,它是一种设计网络应用程序的方式,特别适用于构建 Web 服务,它是一种基于 REST 原则设计的接口规范

说白了,RESTful 接口使用 HTTP 协议定义了一组常见的操作行为:GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。通过合理地使用这些 HTTP 方法,可以实现对资源的增删改查操作。

说的再直白一点,就是接口地址是一样的,通过请求方式(GET/POST/PUT/DELETE)实现对资源的增删改查操作。

因此,假如我们有一些接口是这一种请求方式,通过 id 获取用户信息:/api/user/{id},以上的方式却不太适合,我们可以进行加以改造:

import request from '@/utils/request'

// 定义接口地址
const api = {
  user: '/api/user' // 用户模块
}
const modules = {}

// 改进函数,添加 append 参数,用
Object.keys(api).forEach(key => {
  modules[key] = function (parameter, config = {}) {
    const append = config.append || ''
    const url = `${config.url || api[key]}${append}`
    const method = config.method || 'GET'
    const params = method === 'GET' ? parameter : {}
    const data = method === 'GET' ? {} : parameter
    return request({ ...{ url, method, params, data }, ...config })
  }
})
// 其他不兼容的方法,可使用自定义方法
modules.other = function (params) {
  return request({ url: '', params, method: 'GET' })
}

export default modules

再次运行代码,请求类已经包含了我们的自定义 other 方法

页面中使用方式如下:

import api from '@/api'

// 新增用户
api.user(params, { method: 'POST' })
// 删除用户
api.user({}, { method: 'DELETE', append: `/${userId}` })
// 修改用户
api.user(params, { method: 'PUT' })
// 查询用户
api.user(params, { method: 'GET', append: `/${userId}` })

// 其他不兼容的方法,使用自定义方法
api.other(params)

以上的代码其实就是 Flyit 工具库中 FlyHttp 模块的核心思想,后面的改进优化思路也都是依据请求框架来不断进步的,我整理了一下思路和代码,现已经将它发布到 npm,接下来我们看看具体如何使用吧!

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

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

相关文章

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午,由 deepin(深度)社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG(武汉Linux用户组)线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源,前期咱们已经阐述了如何在本地搭建(Nacos集群搭建【Oracle作外部数据源】),本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…

MperReduce学习笔记下

自定义InputFormat合并小文件 案例需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案。 案例分析 小文件的优化无非以下几种方式: …

Junit5 单元测试入门

基础知识 常用注解含义 Test:标记一个方法为测试方法BeforeEach:标记的方法会在每个测试方法执行前执行AfterEach:标记的方法会在每个测试方法执行后执行BeforeAll:标记的方法会在所有测试方法执行前执行一次AfterAll&#xff1…

【CSS in Depth 2 精译_065】第四部分:CSS 视觉增强技术 + 第 11 章 颜色与对比概述 + 11.1 通过对比进行交流

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 ✔️ 11.1.1 模式的建立 ✔️11.1.2 还原设计稿 ✔️ 11.2 颜色的定义 文章目录 第四部分 视觉增强技术 Visual e…

Java项目实战II基于微信小程序的作品集展示(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的飞速…

基于rpcapd与wireshark的远程实时抓包的方法

基于rpcapd与wireshark的远程实时抓包的方法 服务端安装wireshark侧设置 嵌入式设备或服务器上没有图形界面,通常使用tcpdump抓包保存为pcap文件后,导出到本地使用wireshark打开分析,rpcapd可与wireshark配合提供一种远程实时抓包的方案&…

记录一个Flutter 3.24单元测试点击事件bug

哈喽,我是老刘 这两天发现一个Flutter 3.24版本的单元测试的一个小bug,提醒大家注意一下。 老刘自己写代码十多年了,写Flutter也6年多了,没想到前两天在一个小小的BottomNavigationBar 组件上翻了车。 给大家分享一下事件的经过。…

JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?

类加载器分类 大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。 先回顾下,在 Java 中,类的初始化分为几个阶段: 加载、链接(包括验证、准备和解析)和 初始化。 而 类加载器&#x…

视频监控汇聚平台Liveweb视频安防监控实时视频监控系统操作方案

Liveweb国标GB28181视频平台是一种基于国标GB/T28181协议的安防视频流媒体能力平台。它支持多种视频功能,包括实时监控直播、录像、检索与回看、语音对讲、云存储、告警以及平台级联等功能。该平台部署简单、可扩展性强,支持全终端、全平台分发接入的视频…

Docker-Compose环境变量

Docker-Compose环境变量 背景配置文件修改docker-compose.yml在服务内部使用环境变量重新构建容器补充 背景 现状是通过Docker-Compose配置管理系统的各个容器服务、因为是微服务架构所以配置文件很多、但是例如数据库、redis、kafka等配置都是同一份但是需要在多个配置文件做…

cocotb pytest

打印python中的print , 应该使用 pytest -s pytest --junitxmltest_report.xml --htmlreport.html

openEuler yum 设置国内镜像

查看openEuler系统信息 cat /etc/os-release可以看到详细系统版本如下 NAME"openEuler" VERSION"24.09" ID"openEuler" VERSION_ID"24.09" PRETTY_NAME"openEuler 24.09" ANSI_COLOR"0;31"系统使用的版本是24.0…

电脑鼠标箭头一直闪烁怎么回事?原因及解决方法

电脑鼠标箭头不停闪烁,很多用户都曾遇到过,就是点击也无法点击,只能看到箭头一直闪动。造成这种故障的原因有很多,可能是硬件、软件或系统的问题。本文将介绍电脑鼠标箭头不停闪烁的可能原因和相应的解决方法,帮助大家…

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…

Qt6.8 QGraphicsView鼠标坐标点偏差

ui文件拖放QGraphicsView,src文件定义QGraphicsScene赋值给图形视图。 this->scene new QGraphicsScene();ui.graph->setScene(this->scene);对graphicview过滤事件,只能在其viewport之后安装,否则不响应。 ui.graph->viewport…

TxT360: 一个大规模、高质量、多源融合的数据集,专为预训练大型语言模型设计。

2024-10-04, LLM360项目团队创建了TxT360数据集,这个数据集通过整合多种数据源,为预训练大型语言模型提供了丰富的训练材料,具有重要的研究和应用价值。 数据集地址:TxT360|预训练语言模型数据集|预训练数据集 一、研究背景&…

计算机网络-GRE基础实验二

前面我们学习了GRE隧道的建立以及通过静态路由指向的方式使得双方能够网络互联,但是通过静态路由可能比较麻烦,GRE支持组播、单播、广播因此可以在GRE隧道中运行动态路由协议使得网络配置更加灵活。 通过前面的动态路由协议的学习我们知道动态路由协议都…

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器,用于系统授权。一般不会编写自定义的授权过滤器,而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…

Pixtral Large开源:Mistral AI的1240亿参数多模态模型超越GPT-4o等竞争对手

Pixtral Large是什么 Pixtral Large是由法国人工智能初创公司Mistral AI开发的超大多模态模型,拥有1240亿参数,2024年11月18日正式对外发布。它基于Mistral Large 2开发而成,具备1230亿参数的多模态解码器和10亿参数的视觉编码器。这个模型能…