当前位置:首页 > 技术 > 正文内容

Swagger 高级配置与注解使用

访客 技术 2026年6月3日 1
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Title = "Test API V1",
        Version = "v1",
        Description = "A sample API for testing Swashbuckle",
        TermsOfService = new Uri("http://tempuri.org/terms")
    });

    // 启用注解支持,使 Swagger 特性生效
    c.EnableAnnotations();

    // 全局参数命名转为驼峰格式
    c.DescribeAllParametersInCamelCase();

    // 多态类型处理:使用 OneOf 模式生成联合类型
    c.UseOneOfForPolymorphism();
    
    // 继承关系使用 AllOf 表示
    c.UseAllOfForInheritance();

    // 自定义鉴别器字段名
    c.SelectDiscriminatorNameUsing(baseType => "TypeName");

    // 子类型值映射为名称
    c.SelectDiscriminatorValueUsing(subType => subType.Name);

    // 注入 XML 文档注释
    string xmlFileName = Assembly.GetEntryAssembly().GetName().Name + ".xml";
    string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlFileName);
    c.IncludeXmlComments(xmlPath, true);

    // 定义多态基类的子类型
    c.GeneratePolymorphicSchemas(info =>
    {
        if (info.IsInterface && info.Name == nameof(IAnimal))
        {
            return new[] { typeof(Cat), typeof(Lion) };
        }
        return Enumerable.Empty<Type>();
    });

    // 请求体扩展属性注入
    c.RequestBodyFilter<AssignRequestBodyVendorExtensions>();

    // 接口操作扩展信息
    c.OperationFilter<AssignOperationVendorExtensions>();

    // 模型示例数据填充
    c.SchemaFilter<ExamplesSchemaFilter>();
});

启用注解功能

引入包:Swashbuckle.AspNetCore.Annotations
启用后可使用以下特性: - [SwaggerRequestBody]:定义请求体描述 - [SwaggerResponse]:指定响应状态码及返回类型 - [SwaggerParameter][SwaggerOperation]:自定义接口摘要与描述
[HttpPost("Product")]
[SwaggerOperation(Summary = "创建订单", Description = "提交新订单信息")]
[SwaggerRequestBody(Description = "订单数据体")]
[SwaggerResponse(200, "创建成功", typeof(Order))]
[SwaggerResponse(400, "请求参数无效")]
public IActionResult Post([FromBody] Order request)
{
    return Ok(new { Message = "Success" });
}

[HttpGet("GetOrderName")]
[SwaggerOperation(Summary = "按名称查询订单")]
[SwaggerParameter(Description = "要查询的订单名称", Required = true)]
[ProducesResponseType(typeof(Order), StatusCodes.Status200OK)]
public IActionResult Get([FromQuery] string orderName)
{
    var result = new Order { Id = 1, OrderName = "冰箱订单" };
    return Ok(result);
}

请求体扩展属性

通过自定义过滤器向请求体添加额外元数据。
public class AssignRequestBodyVendorExtensions : IRequestBodyFilter
{
    public void Apply(OpenApiRequestBody requestBody, RequestBodyFilterContext context)
    {
        requestBody.Extensions.Add("x-purpose", new OpenApiString("test111111111"));
    }
}

接口级别扩展信息

为每个 API 操作添加自定义扩展字段。
public class AssignOperationVendorExtensions : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        operation.Extensions.Add("x-purpose", new OpenApiString("test"));
    }
}

模型示例数据填充

在 Schema 中插入预设示例数据。
public class ExamplesSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        schema.Example = GetExampleFor(context.Type);
    }

    private IOpenApiAny GetExampleFor(Type type)
    {
        return type.Name switch
        {
            "Order" => new OpenApiObject
            {
                ["id"] = new OpenApiInteger(123),
                ["orderName"] = new OpenApiString("冰箱的订单")
            },
            _ => null
        };
    }
}

多态类型支持

定义一个接口并注册其子类型,实现动态类型识别。
[SwaggerSubType(typeof(Lion))]
[SwaggerSubType(typeof(Cat))]
public interface IAnimal
{
    int Id { get; }
    string Name { get; }
}

public class Cat : IAnimal
{
    public Cat(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public int Id { get; set; }
    public string Name { get; set; }
}

public class Lion : IAnimal
{
    public Lion(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public int Id { get; set; }
    public string Name { get; set; }
}

多态接口调用示例

控制器方法根据查询参数返回不同子类型实例。
[HttpGet("GetAnimal")]
public ActionResult<IAnimal> GetAnimal([FromQuery] string animalType)
{
    return animalType == "lion"
        ? Ok(new Lion(1, "狮子"))
        : Ok(new Cat(2, "猫"));
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。