【发布时间】:2015-10-31 07:33:52
【问题描述】:
假设我有一个名为Person 的资源。我可以通过将POST 更新为/data/Person/{ID} 来更新Person 实体。为简单起见,假设一个人具有三个属性,名字、姓氏和年龄。
GET /data/Person/1 产生类似:
{ id: 1, firstName: "John", lastName: "Smith", age: 30 }.
我的问题是关于此人的更新以及执行此操作的服务的语义。假设我想更新 John,他现在 31 岁。在设计方法方面,我看到 API 有两种工作方式:
选项 1:
POST /data/Person/1 和 { id: 1, age: 31 } 做正确的事。隐含地,任何未提及的属性都不会更新。
选项 2:
POST /data/Person/1 与 GET 接收的完整对象 - 必须指定所有属性,即使许多属性没有更改,因为 API(在缺少属性的情况下)会假设它的正确值是null。
从推荐的设计角度来看,哪个选项是正确的?选项 1 很有吸引力,因为它简短而简单,但在某些情况下具有模棱两可的缺点。选项 2 让您来回发送大量数据,即使数据没有变化,也不会告诉服务器此有效负载真正重要的是什么(只有年龄发生了变化)。
【问题讨论】:
-
就我个人而言,在我实施了 RESTful API 的项目中,我总是使用选项 1,但这只是我对此事的看法。这个问题真的取决于你作为开发者。顺便说一句,如果您正在开发 RESTful api,您应该使用
PUT而不是POST来更新记录 -
所以@mituw16 在使用选项 1 时,如果您需要将属性更新为 null,您可以显式发送它吗?
-
是的,当试图清空一个属性时,我传回 null
标签: json rest service asp.net-web-api