PATCH方法是否应返回响应正文中资源的所有字段?

时间:2016-06-09 06:13:45

标签: rest http httprequest restful-architecture httpverbs

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

我正在阅读this

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

**Users resource representations**
name: string
age: number
createdon: date
modifiedon: date


PATCH /users/{userId}
Request body
{
  name: 'changedname',
}


Response body Case1
{
  name: 'changedname',
  age: 20,
  createdon: 2016-01-01,
  modifiedon: 2016-06-09
}


Response body Case2
{
  name: 'changedname',
  modifiedon: 2016-06-09
}

3 个答案:

答案 0 :(得分:14)

通常应该通过content negotiation处理。换句话说,如果需要,客户端会询问特定的表示。请求看起来像这样:

PATCH /user/123
Content-Type: application/merge-patch+json
Accept: application/vnd.company.user+json
...

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

PATCH /user/123
Content-Type: application/merge-patch+json
Accept: application/vnd.company.object-fragment+json
...

要求某个对象的通用片段表示。

如果您不想这样做,则不必实施这两种操作,在这种情况下,您只需执行用例并使用406 Not Acceptable回复media-types支持当下。

答案 1 :(得分:4)

PATCH的规范并未强制要求。

如果你想控制它,你可能想看看https://greenbytes.de/tech/webdav/rfc7240.html#return的灵感。

答案 2 :(得分:1)

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