宁静的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' }
我之所以这样做是因为几个原因:
- 我已经写了像angularjs前端框架的API。 在我的特殊情况下,我正在使用angular度资源,我经常只需要资源的id来定位它。 如果我没有在响应正文中返回id,我需要将它parsing出Location标头。
- 在所有书籍的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原则。