缓解POST响应的“最佳”练习

时间:2013-10-05 16:15:42

标签: rest angularjs angularjs-resource

所以这里没什么新内容我只是想弄清楚一些其他帖子似乎找不到任何内容。

我正在创造一个新的资源,并说:

/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'
}

我这样做有几个原因:

  1. 我为像angularjs这样的前端框架编写了api。在我的 特殊情况我使用角度资源,我经常需要 资源的id以找到它。如果我没有返回id 响应主体我需要解析它的位置 报头中。
  2. 在所有书籍的GET中,我通常不仅返回整个对象 身份证。从这个意义上讲,我的客户端代码无需区分 从哪里获取id(位置标题或正文)。
  3. 现在我知道我真的在这里的灰色区域,但是大多数人都说回归整个资源是'糟糕'的做法。但是,如果服务器更改/添加信息到资源,该怎么办?它肯定会添加id,但也可能添加其他内容,如时间戳。在我没有返回整个资源的情况下,最好是进行POST,返回id,然后让客户端执行GET以获取新资源。

2 个答案:

答案 0 :(得分:169)

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

API设计有一个非常好的参考,在这里:Best Practices for Designing a Pragmatic RESTful API

它包含您的问题的答案:Updates & creation should return a resource representation

它说:

  

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

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

答案 1 :(得分:104)

在更新上返回整个对象似乎不太相关,但我很难理解为什么在创建它时返回整个对象在正常用例中是不好的做法。这至少可以很方便地获取ID并在相关时获取时间戳。 这实际上是使用Rails搭建脚手架时的默认行为。

我真的看不到任何优势,只返回ID并执行GET请求,以获取初始POST时可能获得的数据。

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