json - REST服务语义;包括未更新的属性?

标签 json rest service asp.net-web-api

假设我有一个名为 Person 的资源。我可以通过对 /data/Person/{ID} 执行 POST 来更新 Person 实体。为简单起见,假设一个人具有三个属性:名字、姓氏和年龄。

GET/data/Person/1 产生如下内容:

{ id:1,名字:“约翰”,姓氏:“史密斯”,年龄:30 }

我的问题是关于此人的更新以及执行此操作的服务的语义。假设我想更新 John,他现在 31 岁了。就设计方法而言,我看到 API 的工作方式有两种:

选项 1:

POST/data/Person/1 with { id: 1,age: 31 } 做正确的事情。隐含地,任何未提及的属性都不会更新。

选项 2:

POST/data/Person/1 以及 GET 接收的完整对象 - 必须指定所有属性,即使许多属性没有更改,因为 API(在缺少属性的情况下)会假定其正确值为 null

从推荐的设计角度来看,哪个选项是正确的?选项 1 很有吸引力,因为它简短而简单,但缺点是在某些情况下不明确。选项 2 让您来回发送大量数据,即使数据没有发生变化,并且不会告诉服务器此有效负载的真正重要之处(仅发生了年龄变化)。

最佳答案

选项 1 - 更新资源的子集 - 现在在 HTTP 中正式化为 PATCH 方法。选项 2 - 更新整个资源 - 是 PUT 方法。

在现实场景中,通常只想上传资源的子集。这对于请求的性能和客户端的模块化/多样性来说是更好的。

因此,在典型的 API (imo) 中,PATCH 现在比 PUT 更有用,尽管您可以根据需要同时支持两者。在一些极端情况下,平台可能不支持 PATCH,但我相信现在这种情况很少见。

如果您确实支持两者,请不要只是让它们可以互换。与 PUT 的区别在于,如果它收到一个子集,它应该假设整个内容都已上传,因此应该将默认属性应用于那些被省略的属性,或者在需要时返回错误。而 PATCH 只会忽略那些省略的属性。

关于json - REST服务语义;包括未更新的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31884789/

相关文章:

json - 如何为无效输入自定义错误消息?

python - Python 中的 JSON 到 YAML : How to get correct string manipulation?

java - 如何通过单击链接来调用 REST Web 服务

android - 关于android Activity 生命周期的愚蠢问题

json - 使用Lambda部署时,fs.readFileSync无法找到文件

python - 来自 API 请求的 JSON 打印嵌套列表

java - 带有查询参数的 RestTemplate

json - 如何反序列化 WCF Restful 服务的 Json 响应?

android - 为什么 LocalBroadcastManager 不能代替 Context.registerReceiver 工作?

android - Android 服务中的数据包监听器