发明专利公开 -- 一种基于 JSON 文件 + Http Header 的支持多项目、多分支、多人协同的 Api Mock/代理 工具

news2024/11/28 16:01:46

现阶段主流的前后端分离的开发模式下:前后端采用并行开发方式,在前端开发过程中通常需要依附于共同约定的接口格式及数据。
在这里插入图片描述
该过程是一个并行过程,因此 Api Mock 模拟接口的返回变成了必要。同时,联调过程中,修改后端服务地址进行联调也是必要的。

现公布团队的解决方案,也是团队 21 年专利的一项内容(专利公布号:CN113630468A)。

历史现状

前端开发时本地需要启动两个服务,一个服务用于支撑 web 静态资源,一个用于模拟后台 API 接口。

其中静态资源服务包含一个代理 API 地址功能,该代理功能用于将浏览器发送来的后台数据接口(一般接口前缀都具有相同的特征,比如都以 “api/” 开头)进行转发,转发到后台 API 接口的服务上。那么大概有以下 3 个使用场景:

  1. 在开发前端页面时,会将代理设置到本地模拟后台 API 接口的服务上(如下图中的开发环境地址:http://localhost:8080)
  2. 在和后台接口联调时,会将代理设置到后台 API 接口服务(如下图中的后台环境地址:http://192.168.0.100:8080)
  3. 在测试阶段,前端排查问题是可能会将代理设置到测试环境的 API 接口服务(如下图中的测试环境地址:http://192.168.0.200:8080)
    在这里插入图片描述

带来的问题:

  1. 联调的时候可能是一对多(一位前端开发者与多个后台开发者进行联调),多个后台开发者意味有多个后台环境的地址。那么与“后台 A”联调完成后,需要将代理切换到“后台 B”,如此轮换,也有可能与 “后台 A”、“后台 B”交叉联调。而这种方式在当前的前端项目机制中,更改代理地址的步骤:

    第一步:修改配置文件中的 ip 地址
    第二步:杀掉前端服务
    第三步:重新启动前端服务(此过程会执行前端静态资源的编译过程,根据项目大小不同启动速度不同)

    总之为了改一下代理地址需要额外做很多不相干的事情,影响开发与联调的效率。

  2. 一位前端开发者往往会穿插在多个前端项目中。比如以下场景:
    在这里插入图片描述
    多个项目并行,这中间可能造成代理地址端口冲突的问题,这同样需要频繁的修改代理地址,然后重新启动前端项目

实现思路

实现目标:修改代理地址,无需重新编译前端整个工程!
实现方式:抽离统一的代理服务 fusion-mock,前端项目工程中代理地址统一为 fusion-mock 的地址;在 fusion-mock 中进行目标地址的转发策略配置!
在这里插入图片描述
开发一个统一的代理平台,所有项目代理目标地址为该平台。平台中通过识别相应标识,来确定不同项目、不同开发者,然后按照获取到的信息进行转发处理,从而实现无需每次修改目标地址(避免重复构建),统一管理。
在这里插入图片描述

  1. Mock 数据存储方式由「DB」改进为「JSON文件」
    使用 JSON 文件存储(每一个接口对应一个 JSON 文件),无需搭建独立 DB 服务。相关 JSON 文件管理简单,可跟随项目一同托管到 Git 等相关代码仓库中。

    • 创建简单:如:/api/users/person/jerry => 在 /users/person 目录下创建 jerry.json 即可,关系清晰易懂!
    • 方便管理:Mock 数据存储到当前项目工程中,作为资源文件同项目源码进行统一管理。配合开发流程,Mock 数据可以很好的隔离和复用。
    • 无需部署:不需要独立的 Mock 服务(包括 DB 服务等)
      在这里插入图片描述
  2. 通过 Http Header 标识相关信息,统一代理地址

    const mockPath = join(__dirname, 'mock')
    
    devServer: {
      host: '0.0.0.0',
      proxy: {
        '/api': {
          // fusion-mock地址
          target: 'http://localhost:18080',
          /*
          * 'mock-server': '项目标识',
          * 'mock-path':'mockdata路径'
          */
          headers: { 'mock-server': 'am-fe', 'mock-path': mockPath },
          changeOrigin: true
        },
        '^/websocket': {
          target: 'ws://localhost:18080',
          headers: { 'mock-server': 'am-fe' },
          changeOrigin: true,
          ws: true
        }
      }
    }
    

    所有开发者可统一配置成 Fusion Mock 的服务地址(如:httsp://domain:port);不同项目通过 headers 中的字段进行关联。切换连接地址无需重新构建,只需在工具上动态修改即可。
    在这里插入图片描述

  3. 同一项目,多人协同模式
    对于同一项目在线协同开发,多个开发者需要连接不同目标服务器,可以识别 Http Referer 来标识不同开发者,进行差异转发。
    Referer: http://localhost:8080/api/auth/time?xxx
    在这里插入图片描述

具体实施

在这里插入图片描述

  1. mock 机制,需要先在项目目录下实现与 API 路径、存储 JSON 文件路径相匹配的机制。API 路径中最后一层为 JSON 文件名称,前面的则为文件夹目录。比如:/users/person/jerry 则对应的 JSON 文件文件为:项目路径 /mocks/users/person/jerry.json

    mocks/server.js

    app.use(async ctx => {
      let url = ctx.request.url
      // /api/users/person/jerry => /mocks/users/person/jerry.json
      let filePath = path.join(__dirname, ctx.request.path.replace('/api/', '') + '.json')
      let data
      if (fs.existsSync(filePath)) {
        try {
          data = jsonfile.readFileSync(filePath)
        } catch (err) {
          console.error('request: ' + url + ' fail!!!')
        }
      } else {
        console.warn('request: ' + url + ' not exist!!!!')
      }
      ctx.set('Content-Type', 'application/json')
      ctx.body = data
    })
    
  2. 实现一款集成化代理的工具,前端所有项目都将请求转发到此工具地址,统一由此工具进行分配(根据设置好的地址进行二次转发)。详细说明如下:

    • 前端在 Header 中体现出自己的标识(在 Header 中体现对项目没有侵入性)

      proxy: {
      	'/api': {
        	// fusion-mock地址
      		target: 'http://localhost:18080',
       		/*
        	 * 'mock-server': '项目标识',
        	 * 'mock-path':'mockdata路径'
        	 */
        	headers: { 'mock-server': 'am-fe', 'mock-path': path.join(__dirname, 'mock') },
      		changeOrigin: true
        }
      }
      
    • 集成化代理工具识别 Header 中的身份标识,并根据身份标识进行相关的代理设置与读取

    • 集成化代理工具可以根据 referer 中的关键字进行匹配代理转发

    • 集成化代理工具在读取到该项目没有设置代理时,默认使用 header 中携带的绝对 mock 路径进行读取该项目中的 JSON 文件。

       // mockServer 应该是被代理项目的名称,也是mock-assets中的文件夹名称
       const mockServer = ctx.header['mock-server'] as string
       const mockPath = ctx.header['mock-path'] as string
       
       // 如果匹配到了 referer 的配置或者开启了 proxy
       if (isMatcheMReferer || isttpRemoteProxy) {
         // 转发到目标 url
         await await proxyBranch(ctx, targetUrl)
         // return 结束函数运行
         return
       }
       
       // 拆解path路径 找到对应的文件,ctx.mockpath 为 mock 地址的绝对路径
       const filePath = join(_mockPath, ctx.path.replace(searchValue, '') + '.json')
       // read. 读取文件内容
       const content = await promises.readFile(filePath, 'utf8')
       ctx.body = JSON.parse(content)
       ```
      

总结

  1. JSON 文件路径与 API 路径匹配的存储形式(简单高效);
  2. 依赖 Http Header 识别身份,进行动态代理;
  3. 依赖 Http Referer 定制化代理实现的多人协同模式。

如何将“变量”抽离是解决上述问题的核心,然后借助传输过程传递“变量”,统一逻辑处理。

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

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

相关文章

目标检测笔记(九):详细介绍并实现-如何可视化深度学习中每层特征层的网络训练情况

文章目录 为什么要解析特征层如何可视化特征层可视化结果如何 ❤️ 🧡 💛 💚 💙 💜 🖤 🤍 🤎 💔 ❣️ 💕 💞 💓 💗 &#…

随笔-学会和解

上周六,媳妇儿去加班,回到家已经是晚上8点多了。当天的雨淅沥沥地下了一天,气温很低。 看着她情绪不是很高,也没说啥,赶紧安排吃饭。 我:咋的啦,项目不顺利? 她:还行吧…

【深度学习】【人脸检测模型】SCRFD模型的训练与部署实战

文章目录 Linux安装环境pythoninsightface环境 训练数据集准备todo 训练 Linux安装环境 python 我的cuda版本11.6: $ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_Mar__8_18:18:20_PST_2022…

gitlab占用内存太大了如何解决?

大家好,我是雄雄,欢迎关注微信公众号雄雄的小课堂 现在是:2023年5月30日16:58:15 最近在家里自己搞了个服务器,因为这台机器都不用了,从朋友那拿过来,就当服务器用了,看了下,比云服…

python基本操作2(速通版)

关于字符串的基本操作,以实例为主。 目录 一、字符串基本操作 1.基本字符串定义 2.字符串遍历 3字符串切片 二、字符串的常用方法 1.find函数 2.replace函数 3.count函数 4.分割和连接类的函数 5.字符串判断函数 6.去除字符串的 三、元组 1.元组的基本操…

离散数学-集合论

数学基础-离散数学-集合论 集合论是现代各科数学的基础,它起源于十六世纪末期的数集的研究。直到1876-1883年,康托尔发表了一系列有关集合论的文章,奠定了集合论的基础。1904-1908年,策墨罗(Zermelo)提出了集合论的公理系统&…

计算机组成原理-总线-总线的概念、事务和定时

目录 一、总线基本概念 总线特性 二、总线的分类 数据传输格式 2.2按总线的功能 2.2.1片内总线 2.2.2系统总线 2.2.3通信总线 2.3 按时序控制方式 三、系统总线的结构 3.1单总线结构 3.2双总线结构 3.3三总线结构 四、总线的性能指标 五、总线的4个阶段 六、总线的事…

5年测试经验,从月薪9k变1w5,进阶自动化测试真就这么香?

在这个吃技术的IT行业来说,我之前每天做的是最基础的工作,但是随着时间的消磨,我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间,另一个就是做了快2年的测试,感觉每天过得浑浑噩噩,薪资也从…

Java --- 云尚办公之微信公众号整合

目录 一、整合微信公众号 1.1、公众号菜单管理 1.2、微信授权登录 1.3、消息推送 一、整合微信公众号 1.1、公众号菜单管理 数据库表: CREATE TABLE wechat_menu (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 编号,parent_id BIGINT(20) DEFAULT NULL CO…

day42|动态规划4-背包问题分割等和子集

0-1背包和完全背包搞清楚即可。 0-1背包问题-一维 背包有最大重量的限制,物品有重量有价值,那么在最大背包的限制下,能够得到的最大价值是多少? 暴力解法 每个物品都有放和不放两种状态,那么遍历所有的组合就可以…

谷歌浏览器 | Chrome DevTools系统学习篇- Elements面板(上)

大家好,文接上上回谷歌浏览器 | Chrome DevTools系统学习篇-概述,和上文谷歌浏览器 | Chrome DevTools系统学习篇-Device Mode。所谓“工欲善其事,必先利其器”,我们进一步来熟悉谷歌开发者工具。今天分享的是Elements元素&#x…

我在亚马逊云平台的学习成长之路

前言 今年是亚马逊云科技成立的第16个年头,也是云计算行业诞生的16周年。作为云计算时代的“领头羊”,亚马逊2006年推出了名为Amazon Web Services(AWS)的新产品。AWS背后的想法是提供一个平台,同亚马逊内部使用的平台一样,将其作…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

230530-论文整理-课题组2

对这些研究有点兴趣颇微。 文章目录 Rethinking Dense Retrieval’s Few-Shot AbilityDecoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-DecoderPLOME: Pre-training with Misspelled Knowledge for Chinese Spelling CorrectionRead…

北邮22信通:复习补充:双向链表的实现

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏: 北邮22信通_青山如墨雨如画的博客-CSDN博客 **说明** 最近复习看到书后有双向链表的题目,编出来供大家…

Mybatis-Plus 进阶开发-自定义乐观锁插件

文章目录 前言0. OptimisticLockerInnerInterceptor 介绍1. Mybatis-plus 实现乐观锁的原理2. 自定义乐观锁插件1. 创建自定义乐观锁插件2. 配置自定义乐观锁插件 3. 总结 👏作者简介:大家好,我是冰点,从业11年,目前在…

jmeter 性能测试工具的使用(Web性能测试)

1、下载 2023Jmeter性能测试项目实战教程,十年测试大佬手把手教你做性能!_哔哩哔哩_bilibili2023Jmeter性能测试项目实战教程,十年测试大佬手把手教你做性能!共计11条视频,包括:1.什么是性能测试以及性能测…

爬虫进阶-反爬破解1(反爬技术简介、HTTP网络基础知识、搭建代理服务)

目录 一、反爬技术简介 二、HTTP网络基础知识 三、搭建代理服务 一、反爬技术简介 (一)破解Web端反爬技术 1.常见的反爬策略方向:同一时间的请求数量、请求的身份信息、浏览器和爬虫的区别 2.浏览器和爬虫的不同:异步数据加…

Maui初体验

创建Maui应用程序 使用vs创建项目,选择maui模板。 生成即可。 体验Font. 下载字体,放在Font文件夹下,或者子文件夹。 将 文件的生成操作改成MauiFont. 注册字体 如果在Font的子文件夹下,则需要编辑项目,修改ItemGrou…

SeaFormer实战:使用SeaFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…