PATCH方法应该返回响应主体中资源的所有字段吗?

Nig*_*iri 15 rest http httprequest http-verbs restful-architecture

PATCH方法应该返回响应主体中资源的所有字段吗?
或者它应该只返回更新的字段?

我正在读这个

例如,如果它仅返回更新的字段,则用户可以知道在服务器中更新了哪些字段,而用户更新了一些字段.

**Users resource representations**
name: string
age: number
createdon: date
modifiedon: date
Run Code Online (Sandbox Code Playgroud)


PATCH /users/{userId}
Request body
{
  name: 'changedname',
}
Run Code Online (Sandbox Code Playgroud)


Response body Case1
{
  name: 'changedname',
  age: 20,
  createdon: 2016-01-01,
  modifiedon: 2016-06-09
}
Run Code Online (Sandbox Code Playgroud)


Response body Case2
{
  name: 'changedname',
  modifiedon: 2016-06-09
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*gam 14

通常这应该通过内容协商来处理.换句话说,如果需要,客户端会要求特定的表示.请求看起来像这样:

PATCH /user/123
Content-Type: application/merge-patch+json
Accept: application/vnd.company.user+json
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,客户端表示它想要一个完整的user表示作为答案.或者它可以做:

PATCH /user/123
Content-Type: application/merge-patch+json
Accept: application/vnd.company.object-fragment+json
...
Run Code Online (Sandbox Code Playgroud)

要求一些对象的通用片段表示.

你不必同时实现,如果你不想,在这种情况下,你只是做你的使用情况,并作出反应406 Not Acceptablemedia-types你不暂时支持.

  • 我觉得这个答案有点可疑。发送“Accept: vnd.company.user+json”的客户端应该期望收到具有相同“Content-Type”的响应。但这不是“application/json”,我在 RFC 2046 或 9110 中也没有看到任何内容来表明为什么应该这样对待它。`+json` 后缀似乎只是 IANA 注册类型之间的约定,明确声明它们在规范中使用 JSON。我担心的是,期望 HTTP 库将此类响应识别为 JSON 并相应地解析它们的用户可能会惊讶地发现这不起作用。 (3认同)

Jul*_*hke 6

PATCH 的规范没有强制要求这样做。

如果您想控制它,您可能需要查看https://greenbytes.de/tech/webdav/rfc7240.html#return以获得灵感。


Ale*_*scu 5

我不认为 REST 规范(顺便说一句,我认为你需要为此查看RFC 6902 )强制执行任何围绕此的严格规则(你应该返回什么)。我宁愿返回整个资源,以便客户端可以以任何需要的方式使用它。理论上,客户端本身知道修补了什么(至少知道请求是什么)。从服务器获取确认可能并不简单(特别是考虑到 PATCH 主要用于集合),或者至少不值得。