265

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

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

/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,我需要将其从 Location 标头中解析出来。
  2. 在所有书籍的 GET 中,我通常会返回整个对象,而不仅仅是 id。从这个意义上说,我的客户端代码不必区分从哪里获取 id(位置标头或正文)。

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

4

3 回答 3

266

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

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

它在此处包含对您问题的答案:更新和创建应返回资源表示

它说:

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

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

于 2015-03-09T20:21:18.817 回答
164

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

我真的看不出只返回 ID 并在之后执行 GET 请求以获取您可以通过初始 POST 获得的数据的任何优势。

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

于 2013-10-05T19:27:00.047 回答
0

发完帖子后,我喜欢返回如下内容:

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

状态 201 - 已创建

Header Location - 新对象的位置

实体 - 新对象

于 2022-02-04T16:19:55.503 回答