如何在使用 swashbuckle 的 swagger 的发布请求描述中隐藏属性?

Posted

技术标签:

【中文标题】如何在使用 swashbuckle 的 swagger 的发布请求描述中隐藏属性?【英文标题】:How to hide a property just in post request description of swagger using swashbuckle? 【发布时间】:2020-04-14 19:45:32 【问题描述】:

我是 ASP.NET Core 的新手,这个问题看起来很简单,但我在网上找不到合适的解决方案。所以这就是问题所在。 这是我正在使用的类的结构。

public class Alert

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string AlertId  get; set; 
    public string Type  get; set; 


这是对 swagger 中 Post 请求 API 的描述。


  "alertId": "string",
  "type": "string"

由于我在 post 请求中使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 注释 alertId 是可选的。 我的目标是仅从帖子请求描述中隐藏alertId。 我正在使用 ASP.NET Core 3.1、EF Core(3.1.1) 和 Swashbuckle.AspDotNetCore(5.1.0)。 请帮忙。 谢谢你。

【问题讨论】:

最好不要将“警报”对象返回给客户端。您可以创建一个单独的模型(例如“AlertDto”),该模型仅包含您希望在响应中返回的属性。 正如 Ivan 所说,创建一个类来对您需要的用户数据进行建模。获取数据后,可以映射到Alert实体。 正如 Ivan 所说,创建一个类来对您需要的用户数据进行建模。获取数据后,可以映射到Alert实体。 我一直在尝试这样做一段时间。我想使用自定义 HttpPostIgnore 属性从 HttpPost 隐藏/排除 ID 属性。但是当我考虑它时,如果我在 Swagger 中有一个 Schema(模型)在不同的方法中的行为与 Schema 部分中记录的方式不同,那将是令人困惑的。我不希望我的 API 太不标准,所以我停止了我的尝试,而是为不同的方法创建单独的 DTO。只是想把我的观点放在那里:) 嗨@mathkid91,我的回答是你想要的吗? 【参考方案1】:

你可以使用Swashbuckle.AspNetCore.Annotations包,它允许你标记一些属性只显示在输入参数中,一些只显示在输出中。

在你的情况下,你想在帖子的输入参数中隐藏AlertId,你只需要通过[SwaggerSchema]来做到这一点:

public class Alert

    [SwaggerSchema(ReadOnly = true)]
    public string AlertId  get; set; 
    public string Type  get; set; 

在Documentation中查看更多信息

Startup.csConfigureServices 方法中,在Swagger 配置块中启用注释:

services.AddSwaggerGen(c =>

   ...

   c.EnableAnnotations();
);

【讨论】:

您好,感谢您的标签!这听起来像我想要的,但它在我的任何项目中都没有按预期工作 - 至少不是通过安装 NuGet 并添加标签。我将尝试一步一步地按照文档进行检查,以防我在代码中做了一些有趣的事情,或者错过了一些 SwaggerSchema 初始化。 @mathkid91 是的,用c.EnableAnnotations()初始化【参考方案2】:

可以在AlertId字段中添加[JsonIgnore]属性,保证post请求不会得到AlertId的内容。

  public class Alert
    
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [JsonIgnore]
        public string AlertId  get; set; 
        public string Type  get; set; 

    

这里是测试结果:

【讨论】:

以上是关于如何在使用 swashbuckle 的 swagger 的发布请求描述中隐藏属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 swashbuckle 的 swagger 的发布请求描述中隐藏属性?

如何使用 Swashbuckle 从关于 WebAPI 的 Swagger 文档中省略方法

如何使用 Swashbuckle.AspNetCore 隐藏响应代码 200?

Swashbuckle 承载授权

如何使用 Swashbuckle.AspNetCore 在 Swagger 模式中将自定义泛型类型公开为字符串

Swashbuckle.AspNet.Core:Swagger UI 显示空白页面 - 如何修复?