【问题标题】:How to exclude property from Swagger documentation on certain endpoints如何从某些端点上的 Swagger 文档中排除属性
【发布时间】:2020-06-22 02:46:58
【问题描述】:

我是一个大型 C# API 项目的一部分,由于我们的 Swagger 文档中显示了不需要的属性(我们正在使用 Swashbuckle 生成它),我们遇到了客户感到困惑的问题

最简单的形式是这样的:

  • 我们有一个简单的类,只有一个 ID 和一个 Description 属性。

  • 在 POST 中,我们不需要发送 ID(将自动生成)。但是在 GET 和其他动词上,需要返回/发送 ID

我们希望对所有这些端点使用完全相同的模型(为简单起见),但从 POST 请求文档中排除 ID

如果它被端点而不是动词排除会很棒 - 因为我相信我们会遇到一些不是动词特定的场景。

【问题讨论】:

  • 听起来你解决了一个问题只是为了创造另一个问题。也许您应该区分每个操作的消息合同。它应该是规范的模型,而不是操作参数
  • Swashbuckle 是否有办法将属性标记为readOnly?这个场景正是readOnly 的用途。
  • @Helen Yes Swashbuckle 确实支持只读:github.com/domaindrivendev/Swashbuckle/blob/master/…
  • Zyth21,查看 IDocumentFilter,您可以使用它修改生成的 schema.json,您可以添加 @Helen 建议的 readOnly 属性,或者只是为每个操作添加好的示例

标签: c# swagger swashbuckle


【解决方案1】:

我通常使用完全独立的模型,因为我通常遵循 CQRS 模式,因此当我通过 POST 或 PUT 发送命令时,我在 GET 中查询的内容通常看起来并不接近,但我想你可以这样做像这样:

public class AddUpdateAddressType
{
    [Required]
    [StringLength(50, MinimumLength = 2)]
    public string Name { get; set; }

    public string Description { get; set; }
}

public class AddressType : AddUpdateAddressType {

    [JsonProperty(Order = -10)]
    public int Id { get; set; }

    [JsonProperty(Order = 98)]
    [DataType(DataType.DateTime)]
    public DateTime CreatedOn { get; set; }

    [JsonProperty(Order = 99)]
    [DataType(DataType.DateTime)]
    public DateTime ModifiedOn { get; set; }

}

然后在您的控制器操作中,GET 方法被装饰

    [HttpGet("{id:int}")]
    public async Task<IActionResult> Get(int id)
    {
         // fetch and return AddressType
    }

您的 POST(或 PUT)方法可能看起来像这样

    [HttpPost]
    public async Task<IActionResult> Add(AddAddressType addressType)
    {
        // save AddressType and return whatever
    }

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2015-03-27
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多