NetCore 使用 Swashbuckle 搭建 SwaggerHub

来源:https://www.cnblogs.com/calvinK/archive/2023/04/03/netcore-buiding-swaggerhub.html
-Advertisement-
Play Games

什麼是SwaggerHub? Hub 謂之 中心, 所以 SwaggerHub即swagger中心. 什麼時候需要它? 通常, 公司都擁有多個服務, 例如商品服務, 訂單服務, 用戶服務, 等等, 每個服務都有自己的environment, endpoint, swagger schema. 然而這 ...


什麼是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做定製化修改.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信小程式訂閱消息開髮指南(java) 第一步 準備階段 1、你得有一個小程式,並且認證了,個人的也行 2、開通訂閱消息 小程式後臺->功能->訂閱消息 3、公共模板庫選擇一個模板 選擇的時候,選擇你需要的欄位,因為欄位有限制 4、我的模板點擊詳情 詳情內容,模板 id 都是需要提供個服務端開發人員 ...
  • 在堆裡面存放著 Java 世界中幾乎所有的對象實例,垃圾收集器在對 Java 堆進行回收前,第一件事情就是要確定這些對象之中哪些還“存活”著,哪些已經“死去”(“死去”即不可能再被任何途徑使用的對象)。 有兩種判斷對象是否存活的演算法:引用計數演算法、可達性分析演算法。 ...
  • 問題描述 通常我們在rust項目中引入第三方依賴包時,會直接指定包的版本,這種方式指定後,Cargo在編譯時會從crates.io這個源中下載這些依賴包。 [package] name = "foo" version = "0.1.0" edition = "2021" [dependencies] ...
  • 1、定義一個介面用來控制限制的時間 package org.jeecg.common.aspect.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import ...
  • #spring事務理解 前提兩個都是事務的方法,並且兩個方法會進行調用,調用方統一使用required 舉例有兩個方法: required 如果當前上下文存在事務,被調用方則加入該調用方的事務,沒有的話就新建(指單獨被調用時)一個事務 2. supports 支持事務,上下文中有事務,被調用方則加入 ...
  • 1、pom.xml 文件導入插入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem ...
  • 摘要:本次案例,用定值Cookie實現反爬。 本文分享自華為雲社區《我是怎麼用一個特殊Cookie,限制住別人的爬蟲的》,作者: 夢想橡皮擦 。 Cookie 生成 由於本案例需要用到一個特定的 Cookie ,所以我們需要提前將其生成,你可以直接設置一個固定的字元串,也可以使用 Python 加密 ...
  • 一、問題引入 圖書信息管理系統: 出版社有一些圖書數據保存在一個文本文件book.txt 中,為簡單起見,在此假設每種圖書只包括三部分信息:ISBN (書號)、書名和價格,文件中的部分數據如圖2.1 所示。現要求實現一個圖書信息管理系統,包括以下6個具體功能。 (1) 查找:根據指定的ISBN 或書 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...