[ASP.NET WebAPI] #5 Swagger UI如何在C#上使用

Swagger 教學

Program.cs

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
    // Authorization
    options.AddSecurityDefinition("SeeGo",
    new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Type = SecuritySchemeType.ApiKey,
        Scheme = "SeeGo",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "JWT Authorization"
    });

    options.AddSecurityRequirement(
        new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference
                    {
                    Type = ReferenceType.SecurityScheme,
                    Id = "SeeGo"
                    }
                },
                new string[] {}
            }
        });

    // 版本資訊
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "SeeGo API",
        Description = "An ASP.NET Core Web API for SeeGo",

    });

    // using System.Reflection;
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});

找到builder.Services.AddEndpointsApiExplorer();

然後加上上面的程式碼

builder.Services.AddSwaggerGe裡面一定要加上

var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));

然後在下面一堆app.的地方要加上

            // Configure the HTTP request pipeline.
            //if (app.Environment.IsDevelopment())
            //{
            //    app.UseSwagger();
            //    app.UseSwaggerUI();
            //}

            app.UseSwagger();
            app.UseSwaggerUI();

註解的部分是在開發環境的時候用的

專案檔

在專案檔點右鍵編輯專案檔

<PropertyGroup>
  <TargetFramework>net6.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

在裡面加上

<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>

XML

在專案底下新增Docs資料夾 在資料夾裡創一個類似XXXAPIDocs.xml的檔案

裡面放以下這樣的結構

<doc>
    <members>
        <member name="Login">

        </member>

        <member name="驗證電子信箱">

        </member>
    </members>
</doc>

接著就可以開始編寫 比如這樣

<member name=“驗證電子信箱”> <summary> [已完成]驗證電子信箱(VType=1註冊、VType=2忘記密碼、VType=3重新發送驗證碼) </summary> <remarks> <para> 發送包含驗證碼的電子郵件的 API。 </para> <para> 使用VType來切換不同情境(1: 註冊 2: 忘記密碼 3: 重新發送驗證碼)。 </para> </remarks> <param name=“ReqVerifyEmail”></param> <returns>返回包含Token的回應。</returns> <response code=“200”> <remarks> “msg”: “4QP4mGh06iGQD5fdSimTuI0UsY9IG08PdEI14HslhvM=” </remarks> </response> <response code=“400”> <remarks> 錯誤訊息: “VType輸入錯誤!”、“查無此帳號!”、“帳號重複註冊!”、“您的驗證已超過10分鐘!” </remarks> </response> </member>onse> </member>

ReqData.cs

如果有required data,可以直接在此註解,這些內容都會出現在schema內,方便前端開發人員閱讀,並且example的值還會自動帶入測試時的預設值,讓測試更加方便。

/// <summary>寄驗證信需要的資料</summary>
public class ReqVerifyEmail
{
    /// <summary>電子郵件</summary>
    /// <example>test@gmail.com</example>
    public string Email { get; set; }
    /// <summary>驗證類型(1: 註冊 2: 忘記密碼 3: 重新發送驗證碼)</summary>
    /// <example>1</example>
    public int VType { get; set; }
}

ResData.cs

response data也可註解。

/// <summary>通用的 API 回應模型</summary>
public class ResData
{
    /// <summary>回應狀態,例如 "OK"、"Err"</summary>
    /// <example>(狀態碼)</example>
    public string State { get; set; }
    /// <summary>訊息內容或 Token,例如"成功"、"(錯誤訊息)"</summary>
    /// <example>(訊息)</example>
    public string Msg { get; set; }
}

XXXController.cs

可以使用以下方式連結到XML文件

/// <include file='Docs/AccountAPIDocs.xml' path='doc/members/member[@name="驗證電子信箱"]/*'/>
[HttpPost("VerifyEmail")]
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResData))]
[ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ResData))]

file裡面放XML檔案路徑

path則是依據XML檔案的結構,name的名稱是對應的。

<member name="驗證電子信箱">

path='doc/members/member[@name="驗證電子信箱"]/*'

[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResData))]可以指定回應的類型,ResData.cs內註解的內容同樣會出現在response的schema內。

參考

開始使用 Swashbuckle 及 ASP.NET Core | Microsoft Learn

簡介 – Training | Microsoft Learn

XML 文件 – F# | Microsoft Learn