如何使用Swagger UI在ASP.NET Core Web API中实现多态请求体?

omvjsjqw  于 11个月前  发布在  .NET
关注(0)|答案(1)|浏览(236)

我正在开发一个ASP.NET Core Web API,在发送PUT请求时,我需要允许客户端在多个派生类型之间进行选择。
我在代码中使用基类和派生类设置了多态性,并使用自定义JsonConverter来处理序列化。然而,Swagger UI只显示了发送“第一个”类型的主体的选项,我需要启用一个功能,允许用户选择他们想要发送的特定类型。
下面是我如何定义我的模型和控制器:

// Base class and derived classes
public abstract class Base
{
    public Type Type { get; set; }
}

public enum Type
{
    First,
    Second
}

[JsonConverter(typeof(FirstConverter))]
public class First : Base
{
    public string Value { get; set; }
}

[JsonConverter(typeof(SecondConverter))]
public class Second : Base
{
    public string Data { get; set; }
}

// TestController
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    [HttpPut("/base")]
    public IActionResult First([FromBody] Base parameters)
    {
        return Ok(parameters);
    }
}

// Custom JsonConverter for polymorphism
public class TestJsonConverter : JsonConverter<Base>
{
    // Custom converter logic
}

// Swagger Configuration in Startup.cs or Program.cs
builder.Services.AddSwaggerGen(options =>
{
    options.UseOneOfForPolymorphism();
    options.UseAllOfForInheritance();
    options.SchemaFilter<NotificationSettingsSchemaFilter>();
});

字符串
但是在Swagger UI中,看起来我附加到了post:
enter image description here
正如你所看到的,UI没有提供一个选项来选择请求体的“First”或“Second”类型。我在Swagger设置中缺少了什么来启用这个功能?我如何修改我的Swagger配置来允许用户在UI的PUT请求体中选择不同的类型?
任何帮助或指针将不胜感激!

kmynzznz

kmynzznz1#

你尝试做的是可能使用判别器,这是记录在这里:https://github.com/domaindrivendev/Swashbuckle.AspNetCore#enrich-polymorphic-base-classes-with-discriminator-metadata。
适用于您的解决方案:

[SwaggerDiscriminator("type")]
[SwaggerSubType(typeof(First), DiscriminatorValue = "first")]
[SwaggerSubType(typeof(Second), DiscriminatorValue = "second")]
public abstract class Base
{
    public Type Type { get; set; }
}

字符串
这将导致从您的代码生成的OpenAPI规范使用 oneOf 指令和 * 属性,根据这些引用:https://swagger.io/docs/specification/data-models/inheritance-and-polymorphism
然而,我强烈建议你考虑在你的API上公开简单的模型,而不是那些表现出多态性的模型。支持多态性是复杂的,通常是不必要的,更糟糕的是-许多消费者端代码生成器很难正确处理OpenAPI规范中的 oneOf 和 * online * 关键字。

相关问题