最佳实践:Swagger 自动生成 Api 文档

自动生成 API 文档的好处不言而喻,它可以提供给你的团队或者外部协作者,方便 API 使用者准确地调用到你的 API。为了降低手动编写文档带来的错误,很多 API 开发者会偏向于寻找一些好的方法来自动生成 API 文档。本文将会介绍一些常用的文档生成工具:开源工具 Tapir,商业化产品 Apifox。

Tapir 介绍

Tapir 是一个开源的 API 设计和文档工具,它基于 OpenAPI 规范(也称为 Swagger 规范)并提供了更高级别的抽象,可以帮助开发人员更轻松地设计和文档化 RESTful API

Tapir 以可视化的方式显示 API 的不同端点和参数,并提供了丰富的编辑功能和自动化的 API 文档生成工具,可以生成易于阅读和理解的文档,同时也提供了多种导出格式(如 OpenAPI 规范、Markdown 等)以满足不同需求。

除了 API 设计和文档,Tapir 还提供了针对 API 的测试和模拟功能,可以模拟 API 的响应并进行测试。它还提供了自动生成客户端代码的功能,使得开发人员可以更快速地使用 API。

为什么使用 Tapir

1、提供类型安全:Tapir 的主要特点之一是提供类型安全的 API 定义。你可以使用 Scala 的强类型检查器来检查 API 定义的正确性,从而减少由于 API 定义不正确而导致的运行时错误。

import sttp.tapir._import sttp.tapir.generic.auto._import sttp.tapir.json.circe._import io.circe.generic.auto._import java.util.UUIDcase class User(name: String)val paging: EndpointInput[(UUID, Option[Int])] =   query[UUID]("start").and(query[Option[Int]]("limit"))// we can now use the value in multiple endpoints, e.g.:val listUsersEndpoint: PublicEndpoint[(UUID, Option[Int]), Unit, List[User], Any] =   endpoint.in("user" / "list").in(paging).out(jsonBody[List[User]])

2、易于测试:由于 Tapir 提供了类型安全的 API 定义,你可以使用 Scala 的测试框架来轻松地编写测试用例,并确保你的 API 在各种不同的情况下都能正确运行。这可以减少开发过程中的错误和 Bug,提高开发效率。

3、易于维护:Tapir 提供了一种易于维护的 API 定义方式,因为它将 API 定义分解成独立的、可组合的部分。这意味着你可以轻松地更新 API 的某些部分,而不必影响整个 API 的定义。

4、生成客户端和服务器代码:使用 Tapir 可以将 API 定义转换为各种不同类型的客户端和服务器代码,包括 HTTP 客户端和服务器、Scala 和 Java 客户端和服务器等。这可以减少手动编写客户端和服务器代码的工作量,同时减少错误和 Bug 的可能性。

5、自动生成 API 文档:Tapir 提供了一种自动生成 API 文档的方法,这使得 API 文档的创建变得简单且容易维护。你可以选择在运行时从 API 定义生成文档,或者在构建时将 API 定义与文档绑定在一起。

快速使用 Tapir

添加依赖

"com.softwaremill.sttp.tapir" %% "tapir-core" % "1.2.9"

定义一个端点(Endpoint)

case class Status(uptime: Long)


val statusEndpoint: PublicEndpoint[Unit, ErrorInfo, Status, Any] =
   baseEndpoint.in("status").out(jsonBody[Status])

以下是一个分页的例子

import sttp.tapir._
import java.util.UUID

case class Paging(from: UUID, limit: Option[Int])


val paging: EndpointInput[Paging] =   query[UUID]("start").and(query[Option[Int]]("limit"))    .map(input => Paging(input._1, input._2))(paging => (paging.from, paging.limit))

集成 Web 框架

import sttp.tapir._

import sttp.tapir.server.akkahttp.AkkaHttpServerInterpreter

import scala.concurrent.Future

import akka.http.scaladsl.server.Route

import scala.concurrent.ExecutionContext.Implicits.global

def countCharacters(s: String): Future[Either[Unit, Int]] = 

  Future.successful(Right[Unit, Int](s.length))
  
val countCharactersRoute: Route =   AkkaHttpServerInterpreter().toRoute(countCharactersEndpoint.serverLogic(countCharacters))  
  
val countCharactersEndpoint: PublicEndpoint[String, Unit, Int, Any] =   endpoint.in(stringBody).out(plainBody[Int])  val countCharactersRoute: Route =   AkkaHttpServerInterpreter().toRoute(countCharactersEndpoint.serverLogic(countCharacters))

生成 Swagger ui

生成描述可以使用 Swagger 或 Redoc 等用户界面进行文档分享。

"com.softwaremill.sttp.tapir" %% "tapir-swagger-ui-bundle" % "1.2.9"
import sttp.tapir._import sttp.tapir.swagger.bundle.SwaggerInterpreterimport sttp.tapir.server.akkahttp.AkkaHttpServerInterpreterimport scala.concurrent.Futureimport scala.concurrent.ExecutionContext.Implicits.globalval myEndpoints: List[AnyEndpoint] = ???// first interpret as swagger ui endpoints, backend by the appropriate yamlval swaggerEndpoints = SwaggerInterpreter().fromEndpoints[Future](myEndpoints, "My App", "1.0")// add to your akka routesval swaggerRoute = AkkaHttpServerInterpreter().toRoute(swaggerEndpoints)

根据 yaml 生成 endpoint

addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % "1.2.9")
Enable the plugin for your project in the build.sbt:
enablePlugins(OpenapiCodegenPlugin)
Add your OpenApi file to the project, and override the openapiSwaggerFile setting in the build.sbt:
openapiSwaggerFile := baseDirectory.value / "swagger.yaml"

这里附上一些配置说明:

settingdefault valuedescription
openapiSwaggerFilebaseDirectory.value / “swagger.yaml”The swagger file with the api definitions.
openapiPackagesttp.tapir.generatedThe name for the generated package.
openapiObjectTapirGeneratedEndpointsThe name for the generated object.

虽然 Tapir 是一个非常有用的 API 设计和文档工具,但它也存在一些缺点:

  1. 学习成本较高:尽管 Tapir 提供了丰富的功能和自动化工具,但其高级抽象和复杂的用户界面可能会使初学者感到困惑。因此,学习 Tapir 的使用需要一定的时间和经验。
  2. 依赖 OpenAPI 规范:Tapir 基于 OpenAPI 规范,因此使用 Tapir 的前提是要对 OpenAPI 规范有一定的了解和理解。如果对 OpenAPI 规范不熟悉,可能需要花费额外的时间来学习规范和相关的概念。
  3. 代码生成可能不准确:尽管 Tapir 提供了自动生成客户端代码的功能,但生成的代码可能会存在一些问题,例如不准确的注释、不规范的代码结构等,可能需要开发人员花费额外的时间进行调整和优化。
  4. 集成可能存在困难:由于 Tapir 是一个单独的工具,需要与其他开发工具(如编辑器、版本控制系统等)进行集成,可能需要额外的设置和配置,可能会增加一些复杂性。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

express+mysql+vue,从零搭建一个商城管理系统14--快递查询(对接快递鸟)

提示:学习express,搭建管理系统 文章目录 前言一、安装md5,axios,qs二、新建config/logistics.js三、修改routes/order.js四、添加商品到购物车总结 前言 需求:主要学习express,所以先写service部分 快递鸟…

AI人工智能培训讲师ChatGPT讲师叶梓培训简历及提纲ChatGPT等AI技术在医疗领域的应用

叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的建设工作&#xff…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItemGroup)

该组件用来展示列表item分组,宽度默认充满List组件,必须配合List组件来使用。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List。 使用说明 当List…

云与云计算:从传统到云端的IT资源变革

云:从分散到集约,资源服务化的新模式 让我们先通过一个生活化的场景来理解“云”这一概念。几十年前,诸如农村地区的居民需要自给自足,比如在自家院子里打井取水,冬季烧煤取暖,一切满足自己生活需要的都要…

SwiftUI组件 - AsyncImage

SwiftUI组件-AsyncImage import SwiftUIstruct AsyncImageBootcamp: View {let url URL(string: "https://picsum.photos/200")var body: some View {/// Mark - iOS15 以后才有的方法ScrollView {AsyncImage(url: url, content: { returnImage inreturnImage.resiz…

STM32F103 CubeMX 使用USB生成鼠标设备

STM32F103 CubeMX 使用USB生成鼠标设备 1 配置cubeMX1.1配置外部晶振,配置debug口1.2 配置USB1.3 配置芯片的时钟1.4 生成工程 2. 编写代码2.1 添加申明2.2 main函数代码 1 配置cubeMX 1.1配置外部晶振,配置debug口 1.2 配置USB 1.3 配置芯片的时钟 需…

uniapp 开发出现这个 Error in onLoad hook: “SyntaxError: Unexpected end of JSON input“

uniapp 开发出现这个 Error in onLoad hook: “SyntaxError: Unexpected end of JSON input“,这个问题如何解决。 原因: 由于JSON.parse无法识别某些url中的特殊字符比如&等特殊符号造成的。 解决办法: 页面A(JSON.stringify传参&a…

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

Flutter Inspector 视图调试工具突然不能用了

The embedded browser failed to load. Error: JCEF is not supported in this env or failed to initialize 1、在 Android Studio 的 Help 菜单中,找到 Find Action 2、搜索 boot runtime,找到「Choose Boot Java Runtime for the IDE」选项 3、在「…

计算机毕业设计-基于大数据技术下的高校舆情监测与分析

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、研究背景与意义1.1背景与意义1.2 研究内容 二、舆情监测与分析的关键技术2.1 robot协议对本设计的影响2.2 爬虫2.2.1 工作原理2.2.2 工作流程2.2.3 抓取策略2.3 scrapy架构2.3.1 scrapy:开源爬虫架…

【论文阅读笔记】Attention Is All You Need

1.论文介绍 Attention Is All You Need 2017年 NIPS transformer 开山之作 回顾一下经典,学不明白了 Paper Code 2. 摘要 显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新…

vacuum各种选项分析

1、vacuum和vacuum analyze和analyze的区别 我们加上verbose打印vacuum过程中的信息,可以发现: vacuum analyze过程中不但会vacuum表,还会收集表的统计信息,同时还会在表的年龄超过vacuum_freeze_table_age时,将表的年…

Tomcat Session集群---会话绑定

实验配置: 7-1安装Nginx 7-2和7-3安装Tomcat 1.配置7-1 1.做负载均衡,反向代理 [rootlocalhost ~]# vim /etc/nginx/nginx.conf17 http {18 upstream tomcat {19 server 192.168.91.102:8080;20 server 192.168.91.103:8080;2…

【iOS ARKit】PhysicsBodyComponent

在学习完 RealityKit 进行物理模拟的相关理论知识后,下面通过使用 PhysicsBodyComponent 组件进行物理模拟演示,主要代码如下所示,稍后对代码进行详细解析。 // // PhysicsBodyView.swift // ARKitDeamo // // Created by zhaoquan du on…

Docker安装蜜罐Hfish

前言 无意中发现公司的一台服务器被爆破,修改了密码,为了确定内网是否安装需要搭建一个蜜罐来看一下是否存在隐患。 如何安装Docker,请查看我另一篇文章 https://blog.csdn.net/l1677516854/article/details/136751211 一、拉取镜像 dock…

vscode创建文件夹跟在后面,怎么解决?

如果你遇到类似问题。 按照以下操作即可。

模拟量mV小信号隔离变送器

模拟量mV小信号隔离变送器:用于测量微弱小信号的小型仪表设备 一进一出模拟量mV小信号隔离变送器 ◆小体积,低成本,标准DIN35mm导轨安装方式 ◆三端隔离(输入、输出、工作电源间相互隔离) ◆高精度等级(0.1% F.S,0.2% F.S) ◆高线性度(0.1% F.S) ◆高隔离…

回到街头 - 数字时尚嘉年华:Web3的时尚未来,4月香港兰桂坊盛大启幕

随着区块链技术的不断发展,Web3世界正在逐渐改变我们的生活方式。作为这一变革的重要推动者,Vertex Labs荣幸地宣布,将在香港举办一场前所未有的“回到街头-数字时尚嘉年华”。这不仅是一场时尚与科技的完美结合,更是全球顶级IP和…

2024年中国AI服务器行业发展

环洋咨询Global Info Research的AI服务器市场调研报告提供AI服务器市场的基本概况,包括定义,分类,应用和产业链结构,同时还讨论发展政策和计划以及制造流程和成本结构,分析AI服务器市场的发展现状与未来市场趋势&#…

白话transformer(三):Q K V矩阵代码演示

在前面文章讲解了QKV矩阵的原理,属于比较主观的解释,下面用简单的代码再过一遍加深下印象。 B站视频 白话transformer(三) 1、生成数据 我们呢就使用一个句子来做一个测试, text1 "我喜欢的水果是橙子和苹果&…