asp.net core 3.0 中使用 swagger

来源:https://www.cnblogs.com/weihanli/archive/2019/10/18/ues-swagger-in-aspnetcore3_0.html
-Advertisement-
Play Games

asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 簡單的記錄了一下 swagger 的使用,那個項目的 api 比較簡單,都是匿名介面不涉及到認證以及 api 版本控制,最近把另外一個 api 項目升級到了 3.0,還是遇到了一些問題 ...


asp.net core 3.0 中使用 swagger

Intro

上次更新了 asp.net core 3.0 簡單的記錄了一下 swagger 的使用,那個項目的 api 比較簡單,都是匿名介面不涉及到認證以及 api 版本控制,最近把另外一個 api 項目升級到了 3.0,還是遇到了一些問題,這裡單獨寫一篇文章介紹,避免踩坑。

Swagger 基本使用

swagger 服務註冊:

services.AddSwaggerGen(option =>
    {
        option.SwaggerDoc("sparktodo", new OpenApiInfo
        {
            Version = "v1",
            Title = "SparkTodo API",
            Description = "API for SparkTodo",
            Contact = new OpenApiContact() { Name = "WeihanLi", Email = "[email protected]" }
        });
        
        // include document file
        option.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Startup).Assembly.GetName().Name}.xml"), true);
    });

中間件配置:

//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{
    option.SwaggerEndpoint("/swagger/sparktodo/swagger.json", "sparktodo Docs");

    option.RoutePrefix = string.Empty;
    option.DocumentTitle = "SparkTodo API";
});

為 Swagger 添加 Bearer Token 認證

services.AddSwaggerGen(option =>
{
    // ...

    // Add security definitions
    option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        Description = "Please enter into field the word 'Bearer' followed by a space and the JWT value",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
    });
    option.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        { new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference()
            {
                Id = "Bearer",
                Type = ReferenceType.SecurityScheme
            }
        }, Array.Empty<string>() }
    });
});

支持多個 ApiVersion

services.AddApiVersioning(options =>
    {
        options.AssumeDefaultVersionWhenUnspecified = true;
        options.DefaultApiVersion = ApiVersion.Default;
        options.ReportApiVersions = true;
    });

services.AddSwaggerGen(option =>
{
    // ...

    option.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "API V1" });
    option.SwaggerDoc("v2", new OpenApiInfo { Version = "v2", Title = "API V2" });

    option.DocInclusionPredicate((docName, apiDesc) =>
    {
        var versions = apiDesc.CustomAttributes()
            .OfType<ApiVersionAttribute>()
            .SelectMany(attr => attr.Versions);

        return versions.Any(v => $"v{v.ToString()}" == docName);
    });

    option.OperationFilter<RemoveVersionParameterOperationFilter>();
    option.DocumentFilter<SetVersionInPathDocumentFilter>();
});

自定義 Api version 相關的 OperationFilter:

public class SetVersionInPathDocumentFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var updatedPaths = new OpenApiPaths();

        foreach (var entry in swaggerDoc.Paths)
        {
            updatedPaths.Add(
                entry.Key.Replace("v{version}", swaggerDoc.Info.Version),
                entry.Value);
        }

        swaggerDoc.Paths = updatedPaths;
    }
}

public class RemoveVersionParameterOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // Remove version parameter from all Operations
        var versionParameter = operation.Parameters.Single(p => p.Name == "version");
        operation.Parameters.Remove(versionParameter);
    }
}

中間件配置:

//Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
//Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint
app.UseSwaggerUI(option =>
{
    option.SwaggerEndpoint("/swagger/v2/swagger.json", "V2 Docs");
    option.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");

    option.RoutePrefix = string.Empty;
    option.DocumentTitle = "SparkTodo API";
});

最終 swagger 效果

Memo

上面的配置來自 https://github.com/WeihanLi/SparkTodo 這個項目,要獲取代碼可以參考這個項目

Reference


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

-Advertisement-
Play Games
更多相關文章
  • 章節目錄 "第一章 spring boot 2.x基礎及概念入門" "1.1.spring boot 產生的背景及其優勢" "1.2.spring boot 2.x 新特性說明" "1.3.helloworld及項目結構介紹" "1.4.IDEA結合spring boot開發技巧" "第二章 RES ...
  • 面向過程 每一個具體的步驟都親力親為,詳細處理每一個細節 面向對象 不關心具體步驟,而是找一個已經具有該功能的人來幫我做事 特點 封裝性 繼承性 多態性 類 是一組相關屬性和行為的集合 成員變數(屬性):該事物的狀態信息 成員方法(行為):該事物能做什麼 類是對象的模板,對象是類的實體 類的定義格式 ...
  • Auth 類已經在ThinkPHP代碼倉庫中存在很久了,但是因為一直沒有出過它的教程, 很少人知道它, 它其實比RBAC更方便 。 RBAC是按節點進行認證的,如果要控制比節點更細的許可權就有點困難了,比如頁面上面的操作按鈕, 我想判斷用戶許可權來顯示這個按鈕, 如果沒有許可權就不會顯示這個按鈕; 再比如 ...
  • 孩子一直迷戀植物大戰僵屍這款游戲,從一開始的水平不行,到後來經常看植物大戰僵屍的過關視頻來提升自己的游戲水平,到現在游戲是玩的越來越好了,至少感覺植物大戰僵屍這個游戲水平比我強很多。 後來為了能讓孩子在游戲里學到些知識,拿出 CE 教孩子改陽光,他不但學會了改陽光,還自己修改了金幣(關鍵是學會用百度 ...
  • 前言 PHP uniqid()函數可用於生成不重覆的唯一標識符,該函數基於微秒級當前時間戳。在高併發或者間隔時長極短(如迴圈代碼)的情況下,會出現大量重覆數據。即使使用了第二個參數,也會重覆,最好的方案是結合 md5 函數來生成唯一 ID。 使用函數 獲取一個帶首碼、基於當前時間微秒數的唯一 ID。 ...
  • Java併發 進程 進程是程式的一次執行過程,是系統運行程式的基本單位,因此進程是動態的。系統運行一個程式即是一個進程從創建,運行到消亡的過程。 在 Java 中,當我們啟動 main 函數時其實就是啟動了一個 JVM 的進程,而 main 函數所在的線程就是這個進程中的一個線程,也稱主線程。 線程 ...
  • 寫在前面: SQLserver的C#封裝:https://www.cnblogs.com/mexihq/p/11636785.html 類似於上篇有關SQLserver的C#封裝,小編對Oracle資料庫進行了相應的封裝,方便後期開發使用,主要包括Oracle資料庫的連接、增、刪、改、查,如有什麼問 ...
  • using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication1{ public ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...