Dre*_*rew 3 rest web-services asp.net-web-api asp.net-web-api2
它是否违反了REST的概念或接受的约定,在同一个URL上有不同的GET/PUT/POST模型?
一个例子:
考虑在api/things上找到的简单资源
我可以创建一个东西:
POST api/things
with body = { Name: "New Thing" }
Run Code Online (Sandbox Code Playgroud)
这让我和位置一起回归
{ Id: 500, Name: "New Thing", Links: ["api/things/500"] }
Location Header: api/things/500
Run Code Online (Sandbox Code Playgroud)
我可以得到的东西:
GET api/things/500
Run Code Online (Sandbox Code Playgroud)
我会的
{ Id: 500, Name: "New Thing", Links: ["api/things/500"] }
Run Code Online (Sandbox Code Playgroud)
如果我想更新它:PUT api/things/500
{ Name: "Updated Thing", IsActive: false }
Run Code Online (Sandbox Code Playgroud)
此示例中存在隐藏在不同模型后面的"规则".
对此有一个强烈的批评:我无法进行POST来创建一个新的,更改名称字段,并将其返回到更新它.我必须知道删除Id和链接字段.我可以"接受我接受的自由"并允许Ids和链接在PUT请求上,但是我需要做出额外的决定,例如,"如果它们发送的Id/Link不同,它是400吗?" "如果他们不发送ID /链接,它是400吗?"如果API声称在PUT上接受这些字段,那么可以将其视为可以更新的合同.
接受不同方法的不同DTO是完全有效的.通常,POST会创建一个具有默认属性(如Id,StartDate或Active等)的新实体,因此这些属性不会出现在"POST DTO"上.我倾向于回避PUT,因为定义是你用另一个实体替换一个实体,其中可能包括Id.在大多数接受增量和部分对象的情况下,我选择PATCH.您可以验证发送的每个属性,并确定它是否为只读属性.在某些情况下,基于角色,对于一个用户可能只读取,而另一个用户可以对其进行修补.通过这样,POST是一个DTO,PATCH是部分的,PUT是不存在的,并且GET返回完整的DTO.
我只看过PUT有用的几个地方.您想要更改文件的二进制文件,或者您想要更改的集合,PUT非常棒.否则,我喜欢PATCH.
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |