RESTful GET 和 POST 的不同模型
Different Models for RESTful GET and POST
同时 URL 为 GET/PUT/POST 使用不同的模型是否违反了 REST 的思想或公认的惯例?
一个例子:
考虑在 api/things
找到的简单资源
我可以通过以下方式创建一个东西:
POST api/things
with body = { Name: "New Thing" }
这returns我和位置
{ 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"] }
如果我想更新它:
放 api/things/500
{ Name: "Updated Thing", IsActive: false }
在这个例子中有 "rules" 个隐藏在不同的模型后面。
- 创建时不能指定 Id 或 IsActive 设置。 Id 由服务器生成,始终以 Active 启动。
- 您无法更新 Id,因此无法更新使用它的 "link",因此 PUT 模型不包含 Id 字段。
对此强烈批评:我不能POST创建一个新的,更改名称字段,然后将其放回更新。我必须知道删除 Id 和链接字段。我可以 "be liberal in what I accept" 并允许 ID 和链接出现在 PUT 请求上,但随后我需要做出其他决定,例如 "is it a 400 if the Id/Link they send is different?, and " 如果他们不发送 [=50=,是否为 400 ]?"。如果 API 声称接受 PUT 上的这些字段,则可以将其视为可以更新的合同。
对于不同的方法接受不同的 DTO 是完全有效的。通常,POST 会创建一个具有默认属性(例如 Id、StartDate 或 Active 等)的新实体,因此这些属性不会出现在 "POST DTO" 上。我倾向于回避 PUT,因为定义是您将一个实体替换为另一个实体,其中可能包含一个 Id。在大多数接受增量和部分对象的情况下,我会选择 PATCH。您可以验证发送的每个 属性 并确定它是否为只读 属性。在某些情况下,基于角色,它可能对一个用户是只读的,而对另一个用户是可修补的。按照这个,POST 是一个 DTO,PATCH 是部分的,PUT 是不存在的,GET returns 是完整的 DTO。
我只看到 PUT 有用的几个地方。您想要更改文件的二进制文件或者您有一个要更改的集合,PUT 非常棒。否则,我喜欢PATCH。
同时 URL 为 GET/PUT/POST 使用不同的模型是否违反了 REST 的思想或公认的惯例?
一个例子:
考虑在 api/things
找到的简单资源我可以通过以下方式创建一个东西:
POST api/things
with body = { Name: "New Thing" }
这returns我和位置
{ 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"] }
如果我想更新它: 放 api/things/500
{ Name: "Updated Thing", IsActive: false }
在这个例子中有 "rules" 个隐藏在不同的模型后面。
- 创建时不能指定 Id 或 IsActive 设置。 Id 由服务器生成,始终以 Active 启动。
- 您无法更新 Id,因此无法更新使用它的 "link",因此 PUT 模型不包含 Id 字段。
对此强烈批评:我不能POST创建一个新的,更改名称字段,然后将其放回更新。我必须知道删除 Id 和链接字段。我可以 "be liberal in what I accept" 并允许 ID 和链接出现在 PUT 请求上,但随后我需要做出其他决定,例如 "is it a 400 if the Id/Link they send is different?, and " 如果他们不发送 [=50=,是否为 400 ]?"。如果 API 声称接受 PUT 上的这些字段,则可以将其视为可以更新的合同。
对于不同的方法接受不同的 DTO 是完全有效的。通常,POST 会创建一个具有默认属性(例如 Id、StartDate 或 Active 等)的新实体,因此这些属性不会出现在 "POST DTO" 上。我倾向于回避 PUT,因为定义是您将一个实体替换为另一个实体,其中可能包含一个 Id。在大多数接受增量和部分对象的情况下,我会选择 PATCH。您可以验证发送的每个 属性 并确定它是否为只读 属性。在某些情况下,基于角色,它可能对一个用户是只读的,而对另一个用户是可修补的。按照这个,POST 是一个 DTO,PATCH 是部分的,PUT 是不存在的,GET returns 是完整的 DTO。
我只看到 PUT 有用的几个地方。您想要更改文件的二进制文件或者您有一个要更改的集合,PUT 非常棒。否则,我喜欢PATCH。