1. 程式人生 > 實用技巧 >NetCore WebApi專案使用Swagger生成API互動文件

NetCore WebApi專案使用Swagger生成API互動文件

開篇:

  現在專案的開發一般都採用前後端分離的模式,後端同學完成開發後需要給前端的同學提供詳細的API介面文件說明,手動整理費事費力。那有沒有解放雙手的自動化工具呢?答案是肯定的。之前做.net webapi的時候使用的HelpPage來生成的API文件,到netcore這裡,就是我們今天要分享的Swagger,它可以根據程式碼註釋自動生成API描述文件,也可以通過配置生成互動式文件實現線上介面測試。

關於這個swagger大兄弟:

  全稱:Swashbuckle.AspNetCore,開源專案,git地址:https://github.com/domaindrivendev/Swashbuckle.AspNetCore

目錄:

  1.基本使用

    1.1 安裝依賴

    1.2 startup配置

    1.3 swagger啟動配置

  2.進階使用

    2.1 介面描述

    2.2 返回型別描述

    2.3忽略不生成到API文件

    2.4api分組管理

    2.5多xml文件配置

  3.擴充套件使用

    3.1 全域性資訊新增(作者、聯絡人、許可資訊等)

    3.2 預設摺疊配置

一、基本使用

  1.1 安裝Swagger依賴

  第一種方式,程式包管理控制檯:install-package Swashbuckle.AspNetCore

  

  第二種方式,Nuget包管理中搜索Swashbuckle.AspNetCore

  

  1.2 startup配置

  要使用swagger生成文件,我們需要在startup的ConfigureServices 和Configure中對其進行中介軟體配置

  • 在ConfigureServices中註冊swagger生成器

1 // 註冊swagger生成器,定義一個或多個文件,多個文件後邊會講到
2 services.AddSwaggerGen(c =>
3 {
4     c.SwaggerDoc("v1", new OpenApiInfo { Title = "曦昊-API說明文件", Version = "v1" });
5 });

  • 在Configure中啟用中介軟體配置
 // 啟用中介軟體以將生成的 Swagger 公開為JSON終結點
 app.UseSwagger();
 // 啟用swagger-ui 中介軟體,指定 Swagger JSON 終結點,以來公開互動式文件
 app.UseSwaggerUI(c =>
 {
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "API說明文件 V1");
 });

  至此,swagger的基本配置完成,我們可以啟動應用程式,輸入/swagger訪問看看啦

  

  我們可以看到swagger已經自動幫我們生成了專案的api介面描述文件

  

  1.3 swagger啟動配置

  完成上邊的步驟後,我們已經可以啟動瀏覽/swagger訪問我們的Rest Apis文件了,但是每次啟動再輸入swagger也太麻煩了,接下來我們把swagger設定為我們的啟動地址

  檔案:Properties - >launchSettings.json

  將標註位置改為“swagger”

  

  再次啟動,直接進入了我們的swagger文件頁面。

二、進階使用

  2.1 介面描述

  上邊已經提過swagger會根據我們的註釋生成文件描述資訊,但並不是我們添加了註釋就可以的,想要swagger正常顯示我們的備註資訊,除了添加註釋資訊外,我們還要為swagger配置包含xml描述資訊

  首先按照我們平常的註釋方式為介面添加註釋

  

  其次,為我們的專案配置輸出xml檔案(專案右鍵--屬性--生成--輸出)

  

  最後在startup的ConfigureServices中配置swagger包含xml描述資訊

    

    // 配置從xml文件中獲取描述資訊
    // 路徑我們獲取的專案路徑+startup名稱空間(也可以直接寫生成的xml名稱)
    var filePath = Path.Combine(System.AppContext.BaseDirectory, typeof(Startup).Assembly.GetName().Name + ".xml");
    c.IncludeXmlComments(filePath);
View Code

  ok,現在我們啟動除錯進入swaggerUI,我們會看到swagger已經顯示出了我們自定義的註釋資訊

  

  2.2 返回型別描述

  當我們寫的介面已IActionResult為返回型別的時候,我們會發現swagger的Responses下並沒有為我們生成返回資訊描述,因為它並不知道我們具體要返回的是什麼形式的資料

  例如,我們新寫一個分頁介面:

  

  我們可以看到沒有任何的返回資訊描述,那怎麼辦呢?這裡我們就要用到swagger的ProducesResponseType特性來告訴swagger我們的返回結構

  

  再次啟動除錯,我們發現在Responses這一模組已經正確顯示了我們的PageList描述資訊。

  細心的可能會發現我們在使用ProducesResponseType的時候除了給了它一個type,還給了一個200,這是啥意思呢?

  這個200的意思就是響應狀態200的時候我給你返回這麼一個結構的資料,那是不是說我們可以定義不同響應狀態不同資料結構呢?答案是肯定的。ProducesResponseType是可以多次標記的,你只需要為其他狀態按照上邊的方式新增返回結構標記即可

 

  2.3忽略不生成到API文件

  有些時候我們需要向文件的閱讀者隱藏部分的介面資訊,這個時候我們就會用到ApiExplorerSettings特性

  在我們需要隱藏的介面標記 [ApiExplorerSettings(IgnoreApi = true)] 即可

  2.4 api分組管理

  當我們的介面過多想要拆分顯示,或我們根據不同大類進行區分(系統操作、業務操作...),或我們要分多個版本等等,我們就需要用到分組這個操作,實際上分組就是為swagger生成多個文件,上操作:

  第一步,為swagger新增一個新的文件(startup -- > ConfigureServices)

  

  第二步,為swagger新增一個對應的json終結點

  

  第三步,為控制器或action方法新增標記[ApiExplorerSettings(GroupName = "v2")] ,groupName設定的是要在哪一組中顯示,這裡是區分大小寫的,要跟上述設定中保持一致

   然後就可以在swagegrUI介面的右上角切換不同的文件了

  

  2.5 多xml文件配置

  常用場景:跨程式集顯示註釋資訊

  swagger我們預設配置的是載入當前程式生成的xml,我們只需要為為其它程式集配置輸出xml,並在services.AddSwaggerGen中配置載入改xml檔案即可

  例如:

  

  但是,如果有多個程式集需要配置,這裡是不是會有很多的配置項,並且每加一個程式集我們就要寫一遍,即不方便又造成程式碼的臃腫。ok,接下來我們進行一下改版

  首先,我們把所有的xml生成到一個目錄下,比如當前應用根目錄的docs:

  

  

  然後我們在swagger設定xml文件的地方改為以下方式  

    // 獲取自定義的xml目錄   
    var xmlPath = Path.Combine(System.AppContext.BaseDirectory, "Docs");
    DirectoryInfo dir = new DirectoryInfo(xmlPath);
    // 獲取目錄下的所有xml檔案,並設定為swagger文件包含檔案
    dir.GetFiles("*.xml").ToList().ForEach(u =>
    {
         c.IncludeXmlComments(u.FullName, true);
    })

  ok,再次啟動程式,我們會發現,XH.Core下Model物件的描述資訊也有了~

三、擴充套件使用

  3.1全域性資訊新增(作者、聯絡人、許可資訊等)

  這些資訊的配置是在services.AddSwaggerGen下進行配置,如下:

  

  執行程式,顯示如下

  

  3.2 預設摺疊配置

  當介面慢慢變多,你想進入swagger頁面後能非常清晰的瀏覽controller級目錄,你會需要這個配置  

    app.UseSwaggerUI(c =>
    {
         c.SwaggerEndpoint("/swagger/v1/swagger.json", "API說明文件 V1");
         c.SwaggerEndpoint("/swagger/v2/swagger.json", "API說明文件 V2");
         c.DocExpansion(DocExpansion.None); // 全部摺疊
    });

  如果想隱藏掉Schemas,使用c.DefaultModelsExpandDepth(-1) 設定即可,位置同上

  

  

  ok,羅裡吧嗦碼了這些,文字粗糙,請多包涵,有問題歡迎指出,謝過!