POST和PUT的不同型号要求

Box*_*iom 6 c# data-annotations asp.net-web-api

假设我有一个控制器,CatController其中包含GET,POST和PUT操作.它们都使用相同的Cat资源,如下所示:

public class CatDto {
  public int Id { get; set; }

  [Required]
  public string Name { get; set; }

  [Required]
  public bool IsFriendly {get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,仅在创建新cat(POST)时才需要NameIsFriendly属性,但在更新它(PUT)时可选,以允许仅更新单个属性.

到目前为止我处理这个问题的方法只是有两个类,a CreateCatUpdateCat具有相同属性但不同的数据注释.但是我不想要维护两个几乎相同的类.

我当然可以在每个操作中手动验证模型,但数据注释对于诸如全局模型验证器和自动生成Swagger架构之类的东西非常有用.

我也使用Swagger模式自动生成SDK(使用ApiMatic),这导致生成(CreateCatUpdateCat)两个重复的类,实际上应该只是一个资源(Cat).

有没有另一种方法来实现我只想用一个班级做的事情?

And*_*niu 3

老实说,我更喜欢保留单独的模型。您可以拥有一个具有所有公共属性的基本抽象(或不)模型,尽管这不是必需的,只需添加第三个类。有必要吗?我会说不。

POST 和 PUT 之间存在细微差别。如果 PUT 端点中已有 Id 属性,则 POST 和 PUT 都不需要 Id 属性。这样就无需检查 URL 中的 Id 是否与模型中的 Id 匹配。

您的示例并未使差异可见,但在许多情况下,有些字段您并不真正想要更新。例如,假设您有“创建”和“更新”日期字段,您不希望通过 PUT 等方式更改“创建”日期。您不想通过 PUT 更新的数据越多,模型之间的差异就变得越明显和有价值。

在你的情况下,即使有这 2 个属性,我仍然会创建 2 个不同的模型,即使它们实际上是相同的,这设定了 API 如何工作的期望,并在其他正在研究它的人的头脑中创建了一个清晰的设计。