RESTful GET和POST的不同模型

时间:2015-06-23 11:45:48

标签: web-services rest asp.net-web-api asp.net-web-api2

在同一网址上为GET / PUT / POST设置不同的模型是否违反了REST或接受的约定?

一个例子:

考虑在api / things

中找到的简单资源

我可以通过以下方式创建一个东西:

POST api/things 
with body = { Name: "New Thing" }

这会给我带来位置

{ Id: 500, Name: "New Thing", Links: ["api/things/500"] }
Location Header: api/things/500

我可以得到的东西:

GET api/things/500

我会得到

{ Id: 500, Name: "New Thing", Links: ["api/things/500"] }

如果我想更新它: PUT api / things / 500

{ Name: "Updated Thing", IsActive: false }

此示例中有“规则”隐藏在不同模型后面。

  1. 创建时,无法指定Id或IsActive设置。服务器生成的Id始终以Active状态启动。
  2. 您无法更新Id,因此无法更新使用它的“链接”,因此PUT模型不包含Id字段。
  3. 对此有一个强烈的批评:我无法执行POST来创建新的,更改名称字段,并将其返回到更新它。我必须知道删除Id和链接字段。我可以“接受我接受的自由”并允许Ids和链接在PUT请求上,但是我需要做出额外的决定,例如,“如果它们发送的Id / Link不同,它是400吗?” “如果他们不发送ID /链接,它是400吗?”如果API声称在PUT上接受这些字段,那么可以将其视为可以更新的合同。

1 个答案:

答案 0 :(得分:6)

接受不同方法的不同DTO是完全有效的。通常,POST会创建一个具有默认属性(如Id,StartDate或Active等)的新实体,因此这些属性不会出现在“POST DTO”上。我倾向于回避PUT,因为定义是你用另一个实体替换一个实体,其中可能包括Id。在大多数接受增量和部分对象的情况下,我选择PATCH。您可以验证发送的每个属性,并确定它是否为只读属性。在某些情况下,基于角色,对于一个用户可能只读取,而另一个用户可以对其进行修补。通过这样,POST是一个DTO,PATCH是部分的,PUT是不存在的,GET返回完整的DTO。

我只看过PUT有用的几个地方。您想要更改文件的二进制文件,或者您想要更改的集合,PUT非常棒。否则,我喜欢PATCH。