';最佳';restful POST响应的实践

';最佳';restful POST响应的实践,rest,angularjs,angularjs-resource,Rest,Angularjs,Angularjs Resource,所以这里没有什么新鲜事,我只是想得到一些澄清,似乎在其他帖子中找不到任何澄清 我正在重新创建一个新资源,比如: /books (POST) 有一个机构: { title: 'The Lion, the Witch and the Wardrobe', author: 'C. S. Lewis' } 我知道我应该返回一个201(已创建),其中包含新资源的位置标头: Location: /books/12345 我自己似乎无法回答的问题是服务器应该在体内返回什么 我经常这样回答: {

所以这里没有什么新鲜事,我只是想得到一些澄清,似乎在其他帖子中找不到任何澄清

我正在重新创建一个新资源,比如:

/books (POST)
有一个机构:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}
我知道我应该返回一个201(已创建),其中包含新资源的位置标头:

Location: /books/12345
我自己似乎无法回答的问题是服务器应该在体内返回什么

我经常这样回答:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}
我这样做有两个原因:

  • 我已经为angularjs这样的前端框架编写了api。在我的 特殊情况下,我使用角度资源,我经常需要 用于查找它的资源的id。如果我没有在中返回id 我需要将响应体解析出该位置 标题
  • 在获取所有书籍时,我通常返回整个对象,而不仅仅是 id。从这个意义上说,我的客户端代码不必区分 从何处获取id(位置标题或主体)

  • 现在我知道我真的处于灰色地带,但大多数人都说返回全部资源是“糟糕”的做法。但是,如果服务器更改/向资源添加信息,该怎么办。它肯定会添加id,但也可能会添加其他内容,如时间戳。在我不返回整个资源的情况下,是否真的最好执行POST,返回id,然后让客户端执行GET以获取新资源。

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

    我真的不认为只返回ID并在之后执行GET请求来获取您最初发布时可能获得的数据有什么好处


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

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

    这里有一个非常好的API设计参考:

    这里包括对您的问题的回答:

    它说:

    为了防止API使用者必须再次点击API以获取 更新的表示,让API返回更新(或创建)的 作为响应的一部分的表示


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

    我知道这很古老,但我可以给出一个令人信服的理由,在你的帖子之后使用GET。在http/1.1规范中,任何历史工具都可以忽略从GET响应返回的缓存设置。。。因此,如果用户在使用POST更新页面后使用浏览器中的“后退”按钮返回此页面,则可以使用原始GET中过时的缓存数据。因此,如果您重用GET,那么您可以更新缓存,并在页面离开时获得页面外观的更好快照…@shade如果API也是为应用程序设计的,那么您提出两个请求的论点就站不住脚了。在那里,通常通过将模型类型的对象保留在内存中来缓存数据,这通常是通过POST请求的响应来完成的。关于浏览器,只要还有一个GETAPI端点,POST请求的响应就不会有什么影响。即使您检查成熟的框架(如Spring数据),它们也总是在持久化之后返回整个对象。我认为这是一个很好的实践,因为在客户机中,您将保存服务器往返以获得相同的信息。返回整个相关对象集如何?这样,可能的排序可以在服务器端完成,并且简化了前端实现,但这些最佳实践并不是最好的。作者指出,HATEOAS与其他原则一样重要,但不能使用,因为“它还没有准备好”。HATEOAS永远不会“准备就绪”,因为所有RESTful原则都只是架构设计原则,而不是具体的实现。引用的参考是关于作者对RESTfulAPI的看法,由于删除了HATEOAS,它根本不是RESTful。这就是为什么这不是最好的参考:)@marcinn-你会注意到最初的问题中引用了“最佳”一词,我想是因为在这方面有很多意见。我所指的参考资料是我发现很实用的。如果你有更好的参考资料,请分享。我总是乐于学习更多内容。@grahamesd实现与建筑设计原则/模式不同。没有人能指望HATEOAS有一天会准备好,但有可能有人会创建一个许多人都能接受的实现。Vinay还写了关于将http方法映射到URL和特定操作(CRUD)的文章,指出通过URL前缀进行版本控制更为实用,并写道通过查询参数进行过滤是一种方法。。。这很好,但所有这些都与RESTful架构无关。他写了一篇关于某种合同的文章。这对于HTTP API很好,但不要称之为RESTful。@grahamesd这里有一些帖子解释了这一点:-我个人更喜欢用空正文作为帖子响应。RESTful位置头值不应该是URI(唯一资源标识符)吗?因此,您可能应该将其用作ID,而不是解析它以找出服务器内部ID。在我看来,RESTful API使用者应该使用提供的超链接导航,而不是构建路径,猜测特定服务器将资源定位在何处。。。毕竟,客户机还不知道刚刚创建的资源的状态吗?重复它会浪费网络资源。对于创建/插入,状态201-已创建,Hea