fast-api 一款快速将spring的bean发布成接口并生产对应swagger文档调试的轻量级工具

news2024/11/12 23:37:46

fast-api

  • 简介
  • 背景
    • 开发痛点:
    • 分析需求
  • 实战fast-api
    • 快速上手
      • 1. 引入依赖
      • 2. @FastApiMapping标记service对象
      • 3. swagger2/knife4j 在线测试
    • 进阶使用
      • 开启调试模式
      • 支持指定类或包目录发布
      • 如何关闭fast-api
      • 自定义fast-api的前缀
  • 写在最后

简介

fast-api 一款快速将spring的bean(service)发布成接口并生产对应swagger文档的轻量级工具

背景

开发痛点:

在开发阶段自测,或者排查生产测试环境bug, 需要调试具体一段业务逻辑,如XxxService.doSomething(param1, param2,…), 发现没有项目里没有controller接口对应
接口直接调用去验证。这个时候一般两个做法

  • 找到最终会调用这个业务逻辑的controller方法. 通过该接口去请求. 但是中间可能经过很多业务,查库计算,必须分析用什么数据合适,导致入口http接口造数据特别麻烦.
  • 还有一种方式写单元测试,直接调用该业务逻辑.但是还要写代码,多次调试还要,重新运行。项目大的启动费时费力

可能上面两种操作都是程序员的基本操作,但是笔者是一个“超级懒人”。执行一次可以,写多次就真的不能忍了。

分析需求

  1. 不写代码:需要一个"0"开发,实现任意service接口方法,发布web api机制,才能够通过http直接请求需要"诊断"方法。

  2. 极速测试:发布的快速接口需要有uri规则,能够通过http测试工具方便构造请求地址, 请求参数也要,能够与service接口方法参数绑定. 得知道项目有那些接口发布了,请求最好有示例.

根据需求分析,发现没有现成技术实现上面的能力, 因此开发实现了fast-api组件的初版

实战fast-api

快速上手

使用技术

  • spring-boot.version 2.3.2.RELEASE
  • springfox-swagger.version 2.10.5

推荐接入项目使用接近版本,保证兼容性.

1. 引入依赖

springboot引入fast-api-spring-boot-starter的maven

        <dependency>
            <groupId>io.github.easycode8</groupId>
            <artifactId>fast-api-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>

2. @FastApiMapping标记service对象

fast-api默认扫描@FastApiMapping标记Bean的所有公开方法,发布成web接口

@FastApiMapping
@Service
public class HelloService {
  
  //请求json: {"name": "李四"}
  public String sayHello(String name) {
    return "hello " + name;
  }
  //请求json: {"name": "李四", age: 18}
  private  String sayHello2(String name, int age) {
      return "name:" + name + " age:" + age;
  }

  //请求json: {"account":[{"username":"张三"}], "name": "李四"}
  private  List<Account> sayHello3(List<Account> account, String name) {
      System.out.println(name);
      return account;
  }
}
  • 请求说明
    • 请求method: POST
    • 请求uri格式: /fast-api/ServiceName/methodName/参数名
    • 请求方式: json 根据bean方法key:value构造json请求请求体.
  • 请求示例
    • curl -X POST “http://127.0.0.1:8080/fast-api/HelloService/sayHello/name” -H “Content-Type:application/json” -d “{“name”:“zhangsan”}”

3. swagger2/knife4j 在线测试

框架已经通过springfox-swagger2整合swagger2/knife4j 可以通过在线接口文档测试Service方法的接口.

接入项目只要集成swagger2/knife4j可以自动识别fast-api接口.springfox-swagger.version版本基于2.10.5

效果:
在这里插入图片描述
请求测试
在这里插入图片描述

进阶使用

开启调试模式

fast-api默认扫描@FastApiMapping类注释的所有公开方法. 但是还是要写一个注解标记. 能不能再偷懒点? 没问题,开启service-debug模式,@Service标记的bean的public方法自动发布成http接口,无需注解@FastApiMapping

spring:
  fast-api:
    service-debug: true #默认false

适合场景: 开发阶段,调试所有service方法,“指哪打哪”,简直不要太快乐

支持指定类或包目录发布

  • service-debug 模式虽然很强大,但是范围太大了. 不仅自己service发布接口,可能第三方的包也可能发布.
  • @FastApiMapping 虽然可以指定,但是写很麻烦,而且第三方别人的包,导入进来,别人代码写不了.

没关系,这些问题框架也想到了, 框架提供includes模式,可以指定类或者包通配发布fast-api接口

spring:
  fast-api:
    includes:
      - com.demo.service.impl.HelloServiceImpl #按类名匹配
      - com.demo.service.impl.* #按包路径匹配
      # - 可以配置多行

incloudes模式是不限制@Service标记的bean对象. 只要是bean对象(除controller外), 都可以发布

适合场景: 不管是本项目的代码还是其他业务maven导入的代码,都可以包的维度来控制发布fast-api.

如何关闭fast-api

如果测试/生产环境需要临时开启和关闭fast-api能力,框架也提供了支持.

spring:
  fast-api:
    enabled: false #默认true

自定义fast-api的前缀

spring:
  fast-api:
    prefix: you_prefix #默认 fast-api

写在最后

fast-api诞生于,研发"偷懒思维", 提升工作效率. 它看起来是"Service层的controller"或是"service层的restful.“, 是不是破坏了mvc的三层结构呢. 前后端分离大行其道背景下, controller接口越来越成为接口发布能力,弱化了视图的能力.这样场景下, controller写起来多少有点嫌弃 但是它依然是重要的. 毕竟设计模式或分层结构.都是为了团队协作下代码的可读性服务. controller该写还是要写. 但是"偷懒是第一生产力”,希望fast-api提升研发调试友好性能够提供一些帮助.

  • 使用场景不限于
    • 日常service业务逻辑直连快速调试
    • service发布web接口, 可用于外部自动化系统http测试业务
    • 新老项目过度, 调用旧项目能力,免写controller层,提供接口发布能力

最后,欢迎收藏点赞评论,留下你宝贵的意见或者建议.

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

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

相关文章

案例学习6-没有复用思想

背景&#xff1a; 上述两个方法查询同一张表&#xff0c;只是数据结构不同&#xff0c;完全可以合成一份方法&#xff0c;减少代码冗余。 实现效果如下 不传参&#xff0c;查询所有的数据 传入特定参数实现按条件查询&#xff1a; 实现方式&#xff1a; GetMapping(value &q…

Antlr Tool与antlr runtime的版本一致性问题

1. 意外的问题 在学习Antlr4的visitor模式时&#xff0c;使用IDEA的Antlr插件完成了Hello.g4文件的编译&#xff0c;指定的package为com.sunrise.hello 使用visitor模式遍历语法解析树&#xff0c;遍历过程中打印hello语句 public class HelloVisitorImpl extends HelloBaseVi…

Linux进程和任务管理和分析和排查系统故障

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

基于遥感解译与GIS技术生态环境影响评价图件制作

《环境影响评价技术导则 生态影响》&#xff08;HJ 19—2022&#xff09;即将实施&#xff0c;其中生态影响评价图件是生态影响评价报告的必要组成内容&#xff0c;是评价的主要依据和成果的重要表现形式&#xff0c;是指导生态保护措施设计的重要依据。在众多图件中&#xff…

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…

详解命令模式本质及其在高复杂调用中的实践案例

作者&#xff1a;范灿华 阿里同城履约物流技术团队 命令模式是一种设计模式&#xff0c;总结了在特定场景下的最佳设计实践。本文将为大家介绍命令模式的模式本质及灵活运用&#xff0c;并通过一个真实的电商履约系统中的库存调用需求为案例&#xff0c;分享其在高复杂调用中的…

【C语言】8道经典指针笔试题(深度解剖)

上一篇我们也介绍了指针的笔试题&#xff0c;这一篇我们趁热打铁继续讲解8道指针更有趣的笔试题&#xff0c;&#xff0c;让大家更加深刻了解指针&#xff0c;从而也拿下【C语言】指针这个难点! 本次解析是在x86&#xff08;32位&#xff09;平台下进行 文章目录所需储备知识笔…

3分钟上手,2小时起飞!教你玩转OceanBase Cloud

盼星星盼月亮&#xff01;掰掰手指&#xff0c;距离 3 月 25 日还有 123456......两周啦&#x1f929;~ 除了白天的主论坛和分论坛的精彩分享外&#xff0c;晚间的 3 场 Hands-on Workshop 动手实验营也深得大家期待&#xff0c;从部署到迁移&#xff0c;从 On-Premise 到 Clou…

OpenAI——CLIPs(代码使用示例)

OpenAI——CLIPs(打通NLP与CV) Open AI在2021年1月份发布Contrastive Language-Image Pre-training(CLIP),基于对比文本-图像对对比学习的多模态模型&#xff0c;通过图像和它对应的文本描述对比学习&#xff0c;模型能够学习到文本-图像对的匹配关系。它开源、多模态、zero-s…

【Three.js】shader特效 能量盾

shader特效之能量盾前言效果噪点图主要代码index.htmldepth-fs.jsdepth-vs.jsshield-fs.jsshield-vs.js相关项目前言 效果噪点图 为了可以自定义能量球的效果&#xff0c;这里使用外部加载来的噪点图做纹理&#xff0c;省去用代码写特效的过程。 主要代码 index.html <…

数据表(一) - 数据表的种类

在游戏项目中缺少不了数据表&#xff0c;数据决定了游戏的整个进程&#xff0c;因此怎么用数据表配置数&#xff0c;配置数据时是否方便成了关键的问题。那么如何来理解数据表的存在呢&#xff1f;数据表完全可以认为是一个本地的数据库&#xff0c;只不过这个数据库里的数据是…

Facebook Shop和Facebook Marketplace如何选择?

Facebook Shop和Facebook Marketplace都是可以让facebook用户售卖商品的平台&#xff0c;这两者有什么区别&#xff1f;在facebook上开网店要使用那一个平台更好&#xff1f;又要如何开通使用&#xff1f;这篇文章都会一一告诉你&#xff01; 一、Facebook Shop Facebook shop主…

【项目实战】Protobuf入门介绍以及如何生成proto对象文件

一、 Protobuf 介绍 1.1 诞生背景 常用的数据格式是 JSON&#xff0c;XML&#xff0c;或者 YAML&#xff0c;这些都是文本格式&#xff0c;特点是容易被人识别&#xff0c;非常容易编程&#xff0c;缺点是数据量有点大。在某些特定场景下&#xff0c;比如帧同步、各个应用之间…

个人创业做什么比较好?需要具备哪些基本素质?

个人创业是一种创造、追求自由和独立的方式&#xff0c;也是许多人梦寐以求的事情。但是&#xff0c;很多人并不知道该做什么才能取得成功。在这篇文章中&#xff0c;我将探讨一些个人创业的建议&#xff0c;希望能够帮助你找到自己的方向。 1. 站在行业创新的前沿 在当前竞争…

Echarts数据可视化图表设计 学习笔记 python

&#x1f4e3; 概况 Echarts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#xff0c;pyechar…

高端Zynq ultrascale+使用GTH回环测试 提供2套工程源码和技术支持

这目录1、前言2、GTH 高速收发器介绍GTH 高速收发器结构参考时钟的选择和分配GTH 发送端GTH 接收端3、vivado工程详解4、上板调试验证5、福利&#xff1a;工程代码的获取1、前言 Xilinx系列FPGA内置高速串行收发器&#xff0c;配有可配置的IP方便用户调用&#xff0c;按照速度…

QML ComboBox简介

1.简介 ComboBox是一个组合按钮和弹出列表。它提供了一种以占用最小屏幕空间的方式向用户显示选项列表的方法。 ComboBox用数据模型填充。数据模型通常是JavaScript数组、ListModel或整数&#xff0c;但也支持其他类型的数据模型。 常用属性&#xff1a; count : int&#x…

R语言基础(四):数据类型

R语言基础(一)&#xff1a;注释、变量 R语言基础(二)&#xff1a;常用函数 R语言基础(三)&#xff1a;运算 5.数据类型 5.1 基本数据类型 R语言基本数据类型大致有六种&#xff1a; 整数Integer、浮点数Numeric、文本(字符串)Character、逻辑(布尔)Logical、复合类型Complex、…

基于Docker快速搭建蜜罐Dionaea(30)

实验目的 1. 快速搭建Dionaea蜜罐 2. 使用Nmap扫描测试Dionaea蜜罐预备知识1. 初步认识Dionaea dionaea&#xff0c;中文的意思即捕蝇草&#xff0c;是否形容蜜罐很形象&#xff1f;dionaea是nepenthes&#xff08;猪笼草&#xff09;的发展和后续&#xff0c;更加容易被部署和…

华大单片机、STM32单片机如何做printf串口打印格式化输出

第一种方法&#xff1a;使用标准C库&#xff0c;但使用标准C库你必须关闭半主机模式&#xff08;1&#xff09;添加下面代码就是关闭半主机模式/* 告知连接器不从C库链接使用半主机的函数 */ #pragma import(__use_no_semihosting)/* 定义 _sys_exit() 以避免使用半主机模式 */…