2012-06-22 16 views
10

我已經將響應POST請求的API放在一起,方法是將新資源的內容放入響應正文中,並將新資源的URL放入Location HTTP響應頭中。REST響應 - 我應該將新資源的URL放在標題,正文還是兩者中?

樣品要求:

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

{ 
    "name": "[email protected]", 
    "price": "10", 
} 

樣本響應:

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

{ 
    'widget': 
    { 
     'id': "123456", 
     'created': "2012-06-22T12:43:37+0100", 
     'name': "[email protected]", 
     'price': "10", 
    }, 
} 

有人提出的一個問題是,URL也應該在響應主體。對此有最佳做法嗎?

+0

(如果它太主觀,隨意殺死它 - 不確定這是否違反SO的精神) –

回答

6

我會把它放在標題中(如位置: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> 
+0

感謝您的回覆 - 擁有像atompub這樣的基準測試就是我一直在尋找的東西。 –

+2

是的,但請注意,上面顯示的AtomPub返回的實例中的URI實際上是一個鏈接,它告訴接收方如果想要「編輯」資源(遵循HATEOAS原則)要使用哪個URI。嚴格來說,它並不一定與資源本身的URI相同(即,不一定與Location:頭中的值相同,它說明可以獲取資源的位置)。在本例中,發生GET資源的URI和用於編輯資源的URI是相同的。 –

+0

好的,很高興知道。我曾以爲他們永遠都是一樣的。 OP應該考慮這個問題。 – smcg

7

有在體內不把新創建的資源的位置(URL))的理由:該網址是需要服務消費者和服務之間的信息交互的元數據,這不是「業務數據」 。有一個稱爲"Messaging Metadata"的SOA設計模式,它表明URL,安全憑證,關聯標識符,事務ID和其他消息傳遞以及合成上下文數據應放置在標題中,而不是放在消息正文中。事實上,http已經爲它提供了標準的標題位置。

OTOH,如果您的REST服務使用HATEOAS,則響應可能包含一個或多個URL,這些URL直接鏈接到您希望爲消費者動態綁定和調用的操作。

我認爲在標題和正文中的URL是最糟糕的解決方案。冗餘數據從長遠來看很容易出現不一致。

相關問題