繁体   English   中英

POST和PUT的不同模型要求

[英]Different model requirements for POST and PUT

假设我有一个控制器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; }
}

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

到目前为止,我处理此问题的方式仅是拥有两个类,即CreateCatUpdateCat ,它们具有相同的属性,但具有不同的数据注释。 但是我不想维护两个几乎相同的类。

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

我还使用Swagger架构来自动生成SDK(使用ApiMatic ),这导致生成了两个重复的类( CreateCatUpdateCat ),而这些类实际上只能是一个资源( Cat )。

是否有另一种方法可以实现我只想通过一个类进行的操作?

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

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

您的示例没有显示出差异,但是在很多情况下,有些字段您确实不想更新。 例如,假设您具有“创建日期”和“更新日期”字段,例如,您不想通过PUT更改“创建日期”。 不想通过PUT更新的数据越多,模型之间的差异就越明显,也就越有价值。

在您的情况下,即使具有这两个属性,我仍然会创建2个不同的模型,即使它们实际上是相同的,也可以期望API的工作方式,并在其他正在使用该模型的人的脑海中创建清晰的设计。

我会建议您反对的设计。 根据RFC [RFC7231],您可以在此处找到建议不要在PUT方法中进行部分内容更新。

“允许给定目标资源上的PUT的原始服务器必须对包含内容范围标头字段([RFC7233]的4.2节)的PUT请求发送400(错误请求)响应,因为有效负载可能是部分的错误地将PUT表示为完整表示的内容。可以通过针对状态与较大资源的一部分重叠的单独标识的资源,或通过使用专门为部分更新定义的不同方法,来进行部分内容更新。 ,[RFC5789]中定义的PATCH方法)。”

首选的解决方案是使用PATCH方法而不是PUT。 在此链接的RFC中描述了修补方法。 引入PATCH方法进行部分资源修改

因此,请查找PATCH方法,或者如果您想使用PUT,则可能有一个单独的端点,该端点仅采用两个值之一。

可以在这里找到有关PATCH方法的更多信息

因此,要么采用PATCH方法,要么创建不同的模型和端点,以使用PUT进行部分更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM