宁静的POST回应的'最佳'的做法

所以在这里没有什么新的,我只是想澄清,似乎无法find任何其他职位。

我正在重新创build一个新的资源,说:

/books (POST) 

与身体:

 { title: 'The Lion, the Witch and the Wardrobe', author: 'CS Lewis' } 

我知道我应该返回一个201(创build)与新资源的位置标题:

 Location: /books/12345 

我似乎无法回答自己的问题是服务器应该返回到正文中。

我经常做这种types的回应:

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

我之所以这样做是因为几个原因:

  1. 我已经写了像angularjs前端框架的API。 在我的特殊情况下,我正在使用angular度资源,我经常只需要资源的id来定位它。 如果我没有在响应正文中返回id,我需要将它parsing出Location标头。
  2. 在所有书籍的GET中,我通常返回整个对象,而不仅仅是id。 从这个意义上说,我的客户端代码不必区分从哪里获得id(位置标题或正文)。

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

在更新上返回整个对象似乎不太相关,但是我很难看出为什么在创build对象时返回整个对象在正常使用情况下是不好的做法。 这至less可以很容易地获得ID并在相关时获得时间戳。 这实际上是使用Rails脚手架时得到的默认行为。

我真的没有看到任何优势,只返回ID和GET请求之后,以获得您的初始POST可以得到的数据。

无论如何,只要你的API是一致的,我认为你应该select最适合你需要的模式。 没有任何正确的方法来构buildREST API,即imo。

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

这里有一个非常好的APIdevise参考,这里是devise一个实用的RESTful API的最佳实践

它在这里包括你的问题的答案: 更新和创build应该返回一个资源表示

它说:

为了防止API消费者再次击中API以获得更新的表示,使API返回更新(或创build)的表示作为响应的一部分。

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