ITADN
domaindrivendev/Swashbuckle.AspNetCore
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Swashbuckle.AspNetCore

NuGet NuGet Downloads

Build status Code coverage OpenSSF Scorecard

Help Wanted

OpenAPI (Swagger) 工具,用于基于 ASP.NET Core 构建的 API。

直接从您的应用程序代码生成精美的 API 文档,包括一个用于探索和测试操作的 UI。

除了其 Swagger 2.0 和 OpenAPI 3.0/3.1 生成器外,Swashbuckle.AspNetCore 还提供 一个嵌入版本的出色的 swagger-ui 项目,该项目由生成的 OpenAPI JSON 文档提供支持。 这意味着您可以为 API 补充始终与最新代码保持同步的实时文档。最重要的是,它 需要最少的编码和维护,让您能够专注于构建出色的 API。

但这还不是全部!

一旦您拥有一个可以用 OpenAPI 文档描述自身的 API,您就打开了基于 OpenAPI 的 工具宝库,其中包括一个可以针对广泛流行平台的客户端生成器。有关更多详细信息,请参阅 swagger-codegen

[!IMPORTANT]
Swashbuckle.AspNetCore 10.0 版本由于将我们对 Microsoft.OpenApi 的依赖升级到 2.x.x 版本以支持生成 OpenAPI 3.1 文档,因此引入了破坏性变更。详情请参阅 迁移到 Swashbuckle.AspNetCore v10

兼容性

Swashbuckle 版本ASP.NET CoreOpenAPI/Swagger 版本Microsoft.OpenApiswagger-uiRedoc
CI Swashbuckle.AspNetCore version>= 8.0.03.1, 3.0, 2.0Microsoft.OpenApi versionswagger-ui versionRedoc version
Latest Swashbuckle.AspNetCore version>= 8.0.03.1, 3.0, 2.0Microsoft.OpenApi versionswagger-ui versionRedoc version
Last v9 Swashbuckle.AspNetCore version9.0.x, 8.0.x3.0, 2.0Microsoft.OpenApi versionswagger-ui versionRedoc version
Last v8 Swashbuckle.AspNetCore version9.0.x, 8.0.x, 2.3.x3.0, 2.0Microsoft.OpenApi versionswagger-ui versionRedoc version

入门指南

首先,将 kitchen-sink NuGet 包安装到您的 ASP.NET Core 应用程序中:

dotnet add package Swashbuckle.AspNetCore

接下来,在应用程序的启动路径中注册 OpenAPI (Swagger) 生成器,并定义一个或多个 OpenAPI 文档。例如:

using Microsoft.OpenApi;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddMvc();

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});

var app = builder.Build();

app.UseSwagger();

app.Run();

snippet source | anchor

确保你的 API 端点及其参数在适当的位置使用 [Http*][From*] 特性进行装饰。

[HttpPost]
public void CreateProduct([FromBody] Product product)
{
    // Implementation goes here
}

[HttpGet]
public IEnumerable<Product> SearchProducts([FromQuery] string keywords)
{
    // Implementation goes here
    return [];
}

snippet source | anchor

[!NOTE] 如果你省略了显式的参数绑定,生成器默认会将它们描述为 "query" 参数。

然后,使用以下方法之一暴露 OpenAPI JSON 文档端点:

  • 如果你使用的是基于端点的路由,请添加端点:

// Your own endpoints go here, and then...
app.MapSwagger();

snippet source | anchor

  • 添加 OpenAPI 中间件:

app.UseSwagger();

snippet source | anchor

此时,你可以启动应用程序,并在 /swagger/v1/swagger.json 查看生成的 OpenAPI 文档。

最后,你可以选择性地添加 swagger-ui 中间件以暴露交互式文档,并指定用于提供其内容的 OpenAPI 文档:

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("v1/swagger.json", "My API V1");
});

snippet source | anchor

现在你可以重启应用程序,并在 /swagger 查看自动生成的交互式文档。

System.Text.Json (STJ) vs Newtonsoft.Json (Json.NET)

在 Swashbuckle.AspNetCore 的 5.0.0 之前的版本中,Swashbuckle.AspNetCore 会基于 Newtonsoft.Json 序列化器 的行为生成 Schemas(API 暴露的数据类型的描述)。这在当时是合理的,因为那是随 ASP.NET Core 一起发布的序列化器。然而,自 ASP.NET Core 3.0 起,ASP.NET Core 开箱即用地引入了新的序列化器 System.Text.Json (STJ)

如果你想使用 Newtonsoft.Json,你必须安装一个单独的包并显式选择加入。默认情况下,Swashbuckle.AspNetCore 会假设 你正在使用 System.Text.Json 序列化器,并基于其行为生成 schemas。如果你正在使用 Newtonsoft.Json,则需要安装一个 单独的 Swashbuckle.AspNetCore 包 Swashbuckle.AspNetCore.Newtonsoft 以显式选择加入。

以下是针对 ASP.NET Core MVC 执行此操作的示例:

dotnet add package Swashbuckle.AspNetCore.Newtonsoft

services.AddMvc();

services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});

services.AddSwaggerGenNewtonsoftSupport();

snippet source | anchor

Swashbuckle、ApiExplorer 和路由

Swashbuckle 严重依赖于 ApiExplorer,即随 ASP.NET Core 一起发布的 API 元数据层。如果你使用 AddMvc(...) 辅助方法来引导 MVC 堆栈,那么 API Explorer 将自动注册,Swashbuckle.AspNetCore 应该可以正常工作。

然而,如果你使用 AddMvcCore(...) 来构建更精简的 MVC 堆栈,则需要显式添加 API Explorer 服务:

services.AddMvcCore()
        .AddApiExplorer();

snippet source | anchor

此外,如果你使用的是 约定路由(而非特性路由),那么任何使用约定路由的控制器以及这些控制器上的操作都不会在 API Explorer 中表示,这意味着 Swashbuckle 将无法找到这些控制器并 为它们生成 OpenAPI 操作。

例如:

app.UseMvc(routes =>
{
    // SwaggerGen won't find controllers that are routed via this technique.
    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

snippet source | anchor

对于你希望在 OpenAPI 文档中表示的任何控制器,你必须使用特性路由:

[Route("example")]
public class ExampleController : Controller
{
    [HttpGet("")]
    public IActionResult DoStuff()
    {
        // Your implementation
        return Empty;
    }
}

snippet source | anchor

有关更多信息,请参阅 ASP.NET Core MVC 路由文档

组件

Swashbuckle.AspNetCore 由多个组件组成,可根据需求组合使用或单独使用。

其核心包括一个 OpenAPI 生成器、用于将 OpenAPI(Swagger)文档作为 JSON 端点暴露的中间件,以及 swagger-ui 的打包版本。这三个包可以通过 Swashbuckle.AspNetCore "元包" 进行安装,并将协同工作(参见 Getting Started),以提供从代码中自动生成的 API 文档。

此外,还有附加包(CLI 工具、使用 Redoc 的替代 UI 等),可根据需要安装和配置。

"核心" 包

PackageNuGetDescription
Swashbuckle.AspNetCore.SwaggerNuGet暴露 OpenAPI JSON 端点。它期望在 DI 容器中注册 ISwaggerProvider 的实现,并查询以获取 OpenApiDocument 实例,然后将其作为序列化的 JSON 暴露。
Swashbuckle.AspNetCore.SwaggerGenNuGet注入 ISwaggerProvider 的实现,可供上述组件使用。此特定实现从您的应用程序端点(控制器、最小端点等)生成 OpenApiDocument 实例。
Swashbuckle.AspNetCore.SwaggerUINuGet暴露 swagger-ui 的嵌入式版本。您指定它可以从中获取 OpenAPI 文档的 API 端点,并使用它们为您的 API 提供交互式文档。

Additional Packages

PackageNuGetDescription
Swashbuckle.AspNetCore.AnnotationsNuGet包含一组可应用于控制器/端点、操作和模型的自定义特性,以丰富生成的文档。
Swashbuckle.AspNetCore.CliNuGet提供一个命令行界面 (CLI),用于直接从应用程序启动程序集检索 OpenAPI 文档,然后写入文件。
Swashbuckle.AspNetCore.ReDocNuGet公开 Redoc UIswagger-ui 的替代方案)的嵌入式版本。

Community Packages

这些包由 .NET 开源社区提供。

PackageNuGetDescription
Swashbuckle.AspNetCore.FiltersNuGet一些有用的 Swashbuckle.AspNetCore 过滤器,用于添加额外的文档,例如请求和响应示例、授权信息等。有关更多详细信息,请参阅其 README。
Unchase.Swashbuckle.AspNetCore.ExtensionsNuGet一些有用的扩展(过滤器),用于添加额外的文档,例如隐藏未接受角色的 PathItems,修复客户端代码生成的枚举等。有关更多详细信息,请参阅其 README。
MicroElements.Swashbuckle.FluentValidationNuGet使用 FluentValidation 规则而不是 ComponentModel 属性来增强生成的 OpenAPI 模式。
MMLib.SwaggerForOcelotNuGet直接在 Ocelot API Gateway 上聚合微服务的文档。

Configuration and Customization

上述步骤将帮助您以最小的设置快速上手。然而,Swashbuckle.AspNetCore 提供了大量的灵活性,以便您按需进行自定义。

请查看下表以获取所有可能的配置选项的完整列表。

组件配置与自定义
Swashbuckle.AspNetCore.Swagger更改 OpenAPI JSON 端点的路径
使用请求上下文修改 OpenAPI
以 3.1 格式序列化 OpenAPI JSON
以 2.0 格式序列化 Swagger JSON
处理虚拟目录和反向代理
自定义 OpenAPI 文档的序列化方式
Swashbuckle.AspNetCore.SwaggerGen分配显式 OperationIds
列出操作响应
标记必需参数和模式属性
处理表单和文件上传
处理文件下载
包含来自 XML 注释的描述
提供全局 API 元数据
生成多个 OpenAPI 文档
省略已弃用的操作和/或模式属性
省略任意操作
自定义操作标签(例如用于 UI 分组)
更改操作排序(例如用于 UI 排序)
自定义 Schema Ids
为特定类型覆盖 Schema
使用操作、Schema 和文档过滤器扩展生成器
添加安全定义和要求
为 Bearer 认证添加安全定义和要求
继承和多态
Swashbuckle.AspNetCore.SwaggerUI更改 UI 的相对路径
更改文档标题
更改 CSS 或 JS 路径
列出多个 OpenAPI 文档
应用 swagger-ui 参数
注入自定义 JavaScript
注入自定义 CSS
自定义 index.html
启用 OAuth2.0 流程
使用客户端请求和响应拦截器
Swashbuckle.AspNetCore.Annotations安装并启用 Annotations
丰富操作元数据
丰富响应元数据
丰富参数元数据
丰富请求体元数据
丰富模式元数据
将模式过滤器应用于特定类型
添加标签元数据
Swashbuckle.AspNetCore.Cli直接从启动程序集获取 OpenAPI
使用自定义主机配置使用 CLI 工具
Swashbuckle.AspNetCore.ReDoc更改 UI 的相对路径
更改文档标题
应用 Redoc 参数
注入自定义 CSS
自定义 index.html