我正在开发一个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请求体中选择不同的类型?
任何帮助或指针将不胜感激!
1条答案
按热度按时间kmynzznz1#
你尝试做的是可能使用判别器,这是记录在这里:https://github.com/domaindrivendev/Swashbuckle.AspNetCore#enrich-polymorphic-base-classes-with-discriminator-metadata。
适用于您的解决方案:
字符串
这将导致从您的代码生成的OpenAPI规范使用 oneOf 指令和 * 属性,根据这些引用:https://swagger.io/docs/specification/data-models/inheritance-and-polymorphism。
然而,我强烈建议你考虑在你的API上公开简单的模型,而不是那些表现出多态性的模型。支持多态性是复杂的,通常是不必要的,更糟糕的是-许多消费者端代码生成器很难正确处理OpenAPI规范中的 oneOf 和 * online * 关键字。