GET 和 PUT 的表示相同吗?

dur*_*dur 4 rest http

作为其他人(例如:here),我正在为这个问题苦苦挣扎,GETPUT的表示是否应该相同?

例子:

GET 表示:

{
    "id": "0815",
    "name": "jdoe",
    "emailAddress": "jd@example.com",
    "displayName": "John Doe",
    "active": true
}
Run Code Online (Sandbox Code Playgroud)

PUT 表示:

{
    "emailAddress": "jd@example.com",
    "displayName": "John Doe"
}
Run Code Online (Sandbox Code Playgroud)

研究:

我在REST 问题中读到:PUT one representation, GET a different one?没关系,用 GET 获取另一种媒体类型,就像我用 PUT 保存的一样。

我在REST 中阅读- 是否将 ID 放入正文?没关系,用 PUT 省略 id 并用 GET 获取 id。

我在GET Representation != POST Representation中读到,用 PUT 省略很多属性并用 GET 获取它们是可以的。一个例子是JIRA REST API - api/2/myself。GET 返回洞用户模型,而 PUT 仅保存 3 个属性。

这是好的做法吗?我也可以使用PATCH,例如GitHub REST API-users。如果 PUT 具有另一个较小的表示已经足够了,那么将 PATCH 添加到 HTTP 的原因是什么?

此外,我在RESTful 服务部分更新的最佳实践中阅读了更多内容,大多数大型 REST API(例如:Google)使用 PATCH 或POST进行部分更新,而 PUT 仅用于完整/完整更新(例如:Goolge - 更新实体) .

sis*_*hus 5

这个想法是服务器通常比用户拥有更多关于资源的信息,因此 GET可能返回比 PUT 所需的更多信息。有些东西是服务器“拥有”的,因此客户端无法更新。这些可以由 GET 返回,而 PUT 表示不允许用户修改它们。

但是,这与说 PUT 允许您部分更新资源不同。当您 PUT 一个文档时,您会更新该文档涵盖的所有值 - 因此应该从资源中删除通过 PUT 发送的实际文档中不存在的“可选”值。当您对该资源执行后续 GET 时,将不存在可选值。

PATCH的语义应该略有不同 - 使用 PATCH 客户端发送部分更新,以某种方式描述更改。然后以某种方式将这些更改应用于资源。通过 PATCH 发送的文档中未提及的资源部分将不被修改。

另外,请注意 PATCH 被明确定义为既不安全也不幂等。而 PUT 是幂等的但不安全 - 重复相同的请求将导致相同的更改。使用 PATCH,某些更改可能是累积的(例如,向列表添加值),因此重复的请求可能会导致资源的不同状态。