所以这里没有什么新东西,我只是想澄清一下,似乎在其他帖子中找不到任何东西。

我正在创建一个新的资源,结果,说:

/books (POST)

有身体的:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

我知道我应该返回一个201(已创建)与新资源的Location头:

Location: /books/12345

我自己似乎无法回答的问题是服务器应该在主体中返回什么。

我经常做这样的回答:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

我这么做有几个原因:

我为angularjs这样的前端框架写过api。在我 特殊情况下,我使用的是角资源,我经常只需要 用于定位它的资源的id。如果我没有返回id 我需要从Location中解析出响应体 头。 在所有书的GET中,我通常返回整个对象,而不仅仅是 id。从这个意义上讲,我的客户端代码不必进行区分 从哪里获取id (location头或body)。

现在我知道我真的处于灰色地带,但大多数人都说返回整个资源是“坏”的做法。但是如果服务器更改/向资源添加信息呢?它肯定添加了id,但也可能添加其他东西,比如时间戳。在我不返回整个资源的情况下,是否真的更好做一个POST,返回id,然后让客户端执行一个GET来获得新资源。


当前回答

返回新对象符合REST原则“统一接口-通过表示操作资源”。完整对象是已创建对象的新状态的表示。

这里有一个非常好的API设计参考:设计实用RESTful API的最佳实践

它包含了对您问题的回答:更新和创建应该返回资源表示

它说:

为了防止API使用者不得不再次访问API 更新的表示,让API返回更新的(或创建的) 代表作为回应的一部分。

对我来说似乎很实用,它符合我上面提到的REST原则。

其他回答

在更新时返回整个对象似乎不太相关,但我很难理解为什么在创建对象时返回整个对象在正常用例中是一种糟糕的做法。这至少对于轻松地获取ID和相关的时间戳是有用的。 这实际上是在使用Rails搭建脚手架时获得的默认行为。

我真的不认为只返回ID并在之后执行GET请求以获得您可以通过初始POST获得的数据有任何好处。

无论如何,只要你的API是一致的,我认为你应该选择最适合你的需求的模式。在我看来,没有任何正确的方法来构建REST API。

返回新对象符合REST原则“统一接口-通过表示操作资源”。完整对象是已创建对象的新状态的表示。

这里有一个非常好的API设计参考:设计实用RESTful API的最佳实践

它包含了对您问题的回答:更新和创建应该返回资源表示

它说:

为了防止API使用者不得不再次访问API 更新的表示,让API返回更新的(或创建的) 代表作为回应的一部分。

对我来说似乎很实用,它符合我上面提到的REST原则。

在一篇文章之后,我喜欢返回这样的东西:

Response
   .created(URI("/obj/$id"))
   .entity(TheNewObj())
   .build()

状态201 -已创建

头位置-新对象的位置

Entity—新对象