集合,项目,动词和REST界面设计:POST应该返回什么?

时间:2009-08-24 23:23:43

标签: web-services http

我正在设计一个REST接口,我很困惑插入/更新/删除动词应该返回什么(作为响应的内容)。考虑Invoice个实体的接口,可在api/invoices访问:

  • GET /api/invoices会返回发票清单
  • GET /api/invoices/123返回ID为123的发票
  • POST /api/invoices添加新发票(在服务器上生成的ID)
  • POST /api/invoices/123使用ID 123更新发票
  • DELETE /api/invoices/123删除ID为123的发票

前两个方法应该返回的很明显,但是insert / update / delet怎么样?一个明显的答案是add应该返回新创建的项目(即与GET / api / invoices / id完全相同的响应),update应该返回更新的项目(再次,与GET相同) )和delete可能应该什么都不返回(空内容)。这一切都很有意义,而且很有意义。

但是在考虑不像Invoice实体这么简单的项目时,我的问题就开始了。例如,考虑add请求不仅添加项目,而且实际上需要返回有关添加操作的一些额外信息:项目被接受(成功),项目是重复的(成功的信息),项目被忽略(信息成功,我不会详细说明原因),该项目被拒绝(失败)。同样在我的情况下,我想要返回额外的信息,例如为桶添加到新添加的项目中的“响应”信息。我考虑将所有额外信息放在http标题中作为带外信息(如200范围内的额外状态代码甚至自定义标题),但是它是一个黑客攻击,而“响应”部分实际上可能大于项目本身。所以现在我正在考虑add动词返回一个全新的类型,一个包含添加信息的项目(状态,响应,新项目的ID,遍历整个新项目)。它确实完成了工作,但我想念之前的对称性。

这是一个很好的做法(当添加'foo'类型的项目时,返回的类型为'bar')或者是我会在6个月内回顾并拉我的头发,因为我让猫离开了袋子?如果我坚持'对foo返回foo的任何访问,包括添加',那么客户端必须在'add'操作之后进行额外调用以检索它真正感兴趣的信息(即'响应')。

2 个答案:

答案 0 :(得分:1)

您的回复应该相当复杂。它不应与入站请求匹配。我们使用JSON,除了对象之外,我们还有一些其他信息。

典型回应:

[{ "ID": the generated ID, "TYPE": the actual class name, "OBJECT": { the object } }]

POST应返回已创建的对象。如果您有额外的信息(这不是一个好主意),您可以在响应消息中携带它。

PUT应该返回更新的结果。

DELETE,就像GET一样,只能返回一个状态。

状态中的额外信息不是黑客 - 这就是状态代码如此开放的原因。

  • 该项目已被接受(成功) - 状态为200 OK

  • 该项目是重复的(信息成功) - 我不确定您在创建的最终对象之上有什么可能的信息,但这是一个20x的地方 - OK WITH INFO状态。< / p>

  • 该项目被忽略(信息成功,我不会详细说明原因) - 这是不明确的。我不会称之为成功,我称之为40倍 - 忽略不计。如果你不能详细说明原因,你可以称它为20X - 忽略。

  • 该项目被拒绝(失败)。这是一条普通的旧40X REJECTED消息。

答案 1 :(得分:0)

POST返回时要考虑的选项是让它返回额外信息以及指向新创建对象的链接。这会在返回GET将返回的相同内容并返回完全不同的实体之间运行一个很好的中线。