在同一网址上为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 }
此示例中有“规则”隐藏在不同模型后面。
对此有一个强烈的批评:我无法执行POST来创建新的,更改名称字段,并将其返回到更新它。我必须知道删除Id和链接字段。我可以“接受我接受的自由”并允许Ids和链接在PUT请求上,但是我需要做出额外的决定,例如,“如果它们发送的Id / Link不同,它是400吗?” “如果他们不发送ID /链接,它是400吗?”如果API声称在PUT上接受这些字段,那么可以将其视为可以更新的合同。
答案 0 :(得分:6)
接受不同方法的不同DTO是完全有效的。通常,POST会创建一个具有默认属性(如Id,StartDate或Active等)的新实体,因此这些属性不会出现在“POST DTO”上。我倾向于回避PUT,因为定义是你用另一个实体替换一个实体,其中可能包括Id。在大多数接受增量和部分对象的情况下,我选择PATCH。您可以验证发送的每个属性,并确定它是否为只读属性。在某些情况下,基于角色,对于一个用户可能只读取,而另一个用户可以对其进行修补。通过这样,POST是一个DTO,PATCH是部分的,PUT是不存在的,GET返回完整的DTO。
我只看过PUT有用的几个地方。您想要更改文件的二进制文件,或者您想要更改的集合,PUT非常棒。否则,我喜欢PATCH。