19

我已经组合了一个 API,它通过将新资源的内容放在响应正文中,并将新资源的 URL 放在 Location HTTP 响应标头中来响应 POST 请求。

样品要求:

POST /api/v1/widgets HTTP/1.1
Content-type: application/json;
Accept: application/json;

{
    "name": "hugo@example.com",
    "price": "10",
}

示例响应:

HTTP 201 Created
Location: http://example.com/api/v1/widgets/123456

{
    'widget': 
    {
        'id': "123456",
        'created': "2012-06-22T12:43:37+0100",
        'name': "hugo@example.com",
        'price': "10",
    },
}

有人提出了 URL 也应该在响应正文中的问题。有这方面的最佳做法吗?

4

2 回答 2

14

没有将新创建资源的位置(URL)放在正文中是有原因的:URL是服务消费者和服务之间消息交互所需的元数据,它不是“业务数据”。有一种称为“消息元数据”的 SOA 设计模式,它建议 URL、安全凭证、相关标识符、事务 ID 和其他消息传递和组合上下文数据应该放在标题中,而不是放在消息的正文中。事实上,http 已经为此提供了标准的标头位置。

OTOH,如果您的 REST 服务使用 HATEOAS,则响应可能包含一个或多个 URL,这些 URL 是您希望为消费者提供动态绑定和调用的操作的直接链接。

我认为在标题和正文中都有 URL 是最糟糕的解决方案。从长远来看,冗余数据容易出现不一致。

于 2014-11-12T12:33:46.810 回答
11

我会把它放在标题中(作为位置:http ://blah.blah.com/blah )。如果你愿意,你也可以把它放在你的身体里(以你发送的任何适当的格式),这不会是不合适的。

atompub REST API通常是一个好的 REST API 的一个很好的参考。他们把它放在两者中。

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>
于 2012-06-22T15:42:51.363 回答