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

omvjsjqw  于 2024-01-08  发布在  .NET
关注(0)|答案(1)|浏览(328)

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

  1. // Base class and derived classes
  2. public abstract class Base
  3. {
  4. public Type Type { get; set; }
  5. }
  6. public enum Type
  7. {
  8. First,
  9. Second
  10. }
  11. [JsonConverter(typeof(FirstConverter))]
  12. public class First : Base
  13. {
  14. public string Value { get; set; }
  15. }
  16. [JsonConverter(typeof(SecondConverter))]
  17. public class Second : Base
  18. {
  19. public string Data { get; set; }
  20. }
  21. // TestController
  22. [Route("api/[controller]")]
  23. [ApiController]
  24. public class TestController : ControllerBase
  25. {
  26. [HttpPut("/base")]
  27. public IActionResult First([FromBody] Base parameters)
  28. {
  29. return Ok(parameters);
  30. }
  31. }
  32. // Custom JsonConverter for polymorphism
  33. public class TestJsonConverter : JsonConverter<Base>
  34. {
  35. // Custom converter logic
  36. }
  37. // Swagger Configuration in Startup.cs or Program.cs
  38. builder.Services.AddSwaggerGen(options =>
  39. {
  40. options.UseOneOfForPolymorphism();
  41. options.UseAllOfForInheritance();
  42. options.SchemaFilter<NotificationSettingsSchemaFilter>();
  43. });

字符串
但是在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。
适用于您的解决方案:

  1. [SwaggerDiscriminator("type")]
  2. [SwaggerSubType(typeof(First), DiscriminatorValue = "first")]
  3. [SwaggerSubType(typeof(Second), DiscriminatorValue = "second")]
  4. public abstract class Base
  5. {
  6. public Type Type { get; set; }
  7. }

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

相关问题