在同一个URL下,使用不同的模型进行GET/PUT/POST操作是否违反了REST的理念或公认的约定?
举个例子:
考虑一个简单的资源,位于api/things下。
我可以通过以下方式创建一个thing:
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 }
在这个例子中,不同的模型背后隐藏着“规则”。
- 创建时无法指定Id或IsActive设置。 Id始终由服务器生成,并始终处于活动状态。
- 您不能更新Id或使用它的“链接”,因此PUT模型不包含Id字段。
对此有一个强烈的批评:我不能使用POST创建新的,更改Name字段并将其PUT回更新。我必须知道删除Id和links字段。我可以“在接受内容方面保持开放”,允许Id和Links出现在PUT请求中,但那么我需要做出其他决策,例如,“如果他们发送的Id/Link不同,则是否返回400?”,以及“如果他们没有发送Id/Link,则是否为400?”如果API声称接受PUT上的这些字段,那么可以将其视为能够被更新的合同。