REST响应 - 我应该将新资源的URL放在标题,正文还是两者中?

Hug*_*own 17 rest http

我将一个响应POST请求的API放在一起,方法是将新资源的内容放在响应主体中,并将​​新资源的URL放在Location HTTP响应头中.

样品申请:

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

{
    "name": "hugo@example.com",
    "price": "10",
}
Run Code Online (Sandbox Code Playgroud)

样品回复:

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",
    },
}
Run Code Online (Sandbox Code Playgroud)

有人提出了一个问题,即URL也应该在响应的正文中.这是最好的做法吗?

Pau*_*son 13

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

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

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


smc*_*mcg 8

我会把它放在标题中(如位置: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>
Run Code Online (Sandbox Code Playgroud)

  • 是的,但请注意,上面显示的示例返回正文中的URI实际上是一个链接,告诉接收者,如果他们想要"编辑"资源,则使用哪个URI(遵循HATEOAS原则).严格地说,它不一定与资源本身的URI相同(即,不一定与Location:头中的值相同,它告诉您可以获取资源的位置).碰巧在这个例子中,用于获取资源的URI和用于编辑资源的URI是相同的. (4认同)