NetCore 使用 Swashbuckle 搭建 SwaggerHub

什么是SwaggerHub?

Hub 谓之 中心, 所以 SwaggerHub即swagger中心.

什么时候需要它?

通常, 公司都拥有多个服务, 例如商品服务, 订单服务, 用户服务, 等等, 每个服务都有自己的environment, endpoint, swagger schema. 然而这些信息都分散在各处, 如果能集中在一个地方展示出来, 就能减少许多无意义的沟通协作, 另外也可以有更有全局视野查看整个公司的API's.

成熟的商业产品.

例如 https://swagger.io/tools/swaggerhub/, 不光可以做Hub, 还有很多其他的管理功能, 实时的编辑器, 版本管理等等.
商业产品功能很好, 但是要钱.
所以... 我们可以...

使用 Swashbuckle.Swagger 搭建SwaggerHub.

在NetCore的世界里, 我们可以使用 Swashbuckle.AspNetCore来构建一个我们自己的SwaggerHub. 而且特别简单, 我们仅需要一行代码即可

var swaggerUIOptions = new SwaggerUIOptions();
swaggerUIOptions.ConfigObject.Urls = new[] {
    new UrlDescriptor() {
        Name = "swagger name",
        Url= "swagger.json"
    }
};

app.UseSwaggerUI(swaggerUIOptions);

我们只需要配置Urlsoption, 增加多个swagger json 配置就完事儿了, 如此, Hub就完成了. 本文章到这里也就算完事儿了.
剩下的就是根据公司情况如同, 采用的方案不同而要解决的一些实际问题了.

对swaggerUIOptions的改动是实时生效的.

swaggerUIOptions对象的任何更改都是实时生效的, 所以我们可以做到只要改配置即可实时生效.

Url 可以配置为一个endpoint, 直接由swaggerui在浏览器中下载指定的文件.

new UrlDescriptor(){Url="https://www.cnblogs.com/swagger.json"}

Url 也可以是在任何地方的一个文件

//配置url从当前项目的一个地址下载文件.
new UrlDescriptor(){Url="/swagger-file/swagger.json"}

// 从本地读取swagger文件
[HttpGet("/swagger-file/{swaggerName}.json")]
public IActionResult GetSwaggerFileAsync([FromRoute] string swaggerName)
{
    return this.File($"static-file-dir/swaggers/{serviceName}.json", "application/json");
}

当然, 我们也可以读取任何地方的swagger文件, 例如在github, 各种云存储(aws/s3, aliyun/oss)等等.

为每一个swagger配置server地址.

每个swagger可能代表这不同的服务, 大概率就有不同的endpoint, 也可以是多个环境配置地址(dev,uat,staging,pro).
给swagger.json增加servers节点即可.

{
    "servers":["server-endpoint1","server-endpoint2"]
}

可以使用各个JSON组件动态插入, 也可以用Microsoft.OpenApi.Readers 组件来解析和改写所有swagger的内容

var doc = new OpenApiStreamReader().Read(sourceSwaggerJson, out _);
doc.Servers.Add(new OpenApiServer() { Url = "my-dev-server-endpoint" });
doc.Servers.Add(new OpenApiServer() { Url = "my-pro-server-endpoint" });
string swaggerJsonContent = targetDoc.SerializeAsJson(Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0);

Microsoft.OpenApi.Readers 可以用来解析openAPI 格式的文档. 支持v2,v3等版本, 支持json,yaml格式. 详情可查看官方文档. 所以这个netcore 的 swaggerhub 自然而然的就支持读取任何语言支持的openAPI文档(java, nodejs, 等等).

合并多个swagger文档到一个swagger文档

单一的一个服务由多个不同的服务提供服务支持. 举个例子, 商品服务由商品服务+商品搜索服务共同组成, 2个单独的服务由2个单独的team负责维护, 但是对外提供服务的时候暴露在同一个domian下, 根据path route到不同的服务上. 这个时候我们还是使用Microsoft.OpenApi.Readers 来做合并这个事情.

//demo代码
var productDoc= download();
var productSearchDoc= download();
var targetDoc = new OpenApiDocument() { Components = new(), Paths = new() };

targetDoc.Paths.Add(productDoc.Paths)
targetDoc.Paths.Add(productSearchDoc.Paths)
targetDoc.Components.Schemas.Add(...)
//巴拉巴拉
string swaggerJsonContent = targetDoc.SerializeAsJson(Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0);

上面只是列出了我碰到的几个具体情况, 不同的公司不同的场景下还有更多可能的case. 这个就得case by case了. 但是一个万变不离其宗, 总之就是对openAPI生成是swagger文件进行自定义. 这个时候用Microsoft.OpenApi.Readers就完事了.

综上,
SwaggerHub, SwaggerUI 用Swashbuckle.AspNetCore搭建.
OpenAPI Swagger Doc 用Microsoft.OpenApi.Readers做定制化修改.

原文链接:https://www.cnblogs.com/calvinK/p/netcore-buiding-swaggerhub.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NetCore 使用 Swashbuckle 搭建 SwaggerHub - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 详解.NET数据库连接池

    详解.NET数据库连接池 在.NET应用程序中,数据库连接池是一种重要的技术,它可以提高应用程序的性能和可伸缩性。本攻略将深入讲解.NET数据库连接池的工作原理、配置和最佳实践,并提供两个示例说明。 工作原理 当.NET应用程序需要与数据库进行通信时,它会从连接池中获取一个可用的连接。如果连接池中没有可用的连接,则应用程序将等待,直到有可用的连接为止。当应用…

    C# 2023年5月17日
    00
  • c#通过进程调用cmd判断登录用户权限代码分享

    下面是详细的攻略: 1. 什么是进程调用? 进程调用是指一个程序调用另一个程序的过程。在操作系统中,每个程序都有一个进程 ID(PID),可以用这个 PID 来识别程序。进程调用可以用来执行一些和本程序无关的任务,比如打开新程序、关闭进程、执行命令等。 2. 怎样通过进程调用 cmd? 在 C# 中,可以通过 Process 类来操作进程。Process.S…

    C# 2023年5月15日
    00
  • 用C#中的params关键字实现方法形参个数可变

    使用params关键字可以实现C#中方法形参个数可变。在方法的参数列表中,可以在最后一个参数前添加params关键字,这个参数就会成为可变参数,允许传递多个同类型的值,并把它们打包成一个数组。下面是具体的步骤: 1.在方法定义时,在最后一个参数前添加params关键字,表示该参数可以传递多个同类型的值。 2.在方法内部,使用该参数时,直接把该参数当成数组来使…

    C# 2023年6月8日
    00
  • C# Linq的Cast()方法 – 将序列中的元素强制转换为指定类型

    C# Linq的Cast()是一个操作符,它用于将一些特定类型的序列中的元素转换为指定的类型。下面是关于使用Cast()操作符的完整攻略: 1. Cast()操作符的语法 Cast()操作符的语法如下: IEnumerable<TResult> source.Cast<TResult>() source:这个是要转换类型的序列的类型。…

    C# 2023年4月19日
    00
  • 轻松学习C#的属性

    当您学习C#编程语言时,属性是一个重要的概念。属性可用于对类中的字段进行访问、设置和检查。通过使用属性,可以更好地组织代码并提高代码重用性。 什么是属性? 属性是一种C#编程语言中的特殊语法,它允许使用getter和setter方法对类中的字段进行访问、设置和检查。通过属性,可以在类外部访问私有字段,其本质上是对字段进行封装,确保对数据的访问是安全和可控的。…

    C# 2023年6月1日
    00
  • C#简单爬虫案例分享

    下面我将为你详细讲解有关“C#简单爬虫案例分享”的完整攻略。 1. 爬虫原理 爬虫是指程序自动化地访问互联网资源并提取信息。其基本原理是通过HTTP请求,获取服务器返回的HTML页面,并解析其中的内容进行采集、处理和格式化。通常,爬虫程序的实现过程可以分为以下几个步骤: 发送HTTP请求,并获取服务器返回的HTML页面。 解析HTML页面中的内容,识别其中的…

    C# 2023年6月1日
    00
  • C# Stream.ReadByte – 从流中读取一个字节

    C# 中的 Stream 类提供了许多方法来读取和写入字节流,其中包括 ReadByte 方法。ReadByte 方法的作用是从当前流中读取下一个字节并提升流的位置一个字节,如果流已经结束,则返回 -1。 使用方法的完整攻略如下: 语法 public virtual int ReadByte(); 返回值 返回读取的字节的整数表示形式,如果已经读取到流的末尾…

    C# 2023年4月19日
    00
  • C# 创建报表过程详解

    标题:C# 创建报表过程详解 1. 介绍 在C#中,我们可以使用ReportViewer控件来创建报表。ReportViewer控件是Visual Studio自带的,使用它可以在Web和Winform应用程序中显示报表。本文将介绍如何使用ReportViewer控件创建报表。 2. 步骤 2.1 安装ReportViewer控件 在Visual Studi…

    C# 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部