2012-06-22 33 views
10

Tôi đã đặt cùng một API phản hồi yêu cầu POST bằng cách đặt nội dung của tài nguyên mới vào nội dung phản hồi và URL của tài nguyên mới trong tiêu đề phản hồi HTTP vị trí.Phản hồi REST - tôi có nên đặt URL của tài nguyên mới vào tiêu đề, nội dung hoặc cả hai?

mẫu yêu cầu:

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

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

mẫu phản ứng:

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", 
    }, 
} 

Có người đã nêu ra một vấn đề mà các URL cũng phải ở trong cơ thể của các phản ứng. Có thực hành tốt nhất về điều này không?

+0

(Hãy tự do giết điều này nếu nó quá chủ quan - không chắc chắn điều này trái với tinh thần SO hay không) –

Trả lời

6

Tôi sẽ đặt nó vào tiêu đề (như Vị trí: http://blah.blah.com/blah). Bạn cũng có thể đặt nó vào cơ thể nếu bạn muốn (trong bất cứ định dạng phù hợp nào bạn đang gửi), và nó sẽ không đúng.

atompub REST API thường là tham chiếu tốt cho API REST tốt. Họ đặt nó trong cả hai.

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

Cảm ơn bạn đã trả lời - có điểm chuẩn như atompub chỉ là những gì tôi đang tìm kiếm. –

+2

Có, nhưng lưu ý rằng URI trong ví dụ được trả về từ AtomPub được hiển thị ở trên thực sự là một liên kết cho người nhận biết URI nào sẽ sử dụng nếu họ muốn "chỉnh sửa" tài nguyên (theo nguyên tắc HATEOAS). Nó không phải là, nói đúng, nhất thiết phải giống như URI của chính tài nguyên (tức là không nhất thiết giống như giá trị trong tiêu đề Location:, cho biết nơi bạn có thể GET tài nguyên). Điều đó xảy ra trong ví dụ này, URI để GET tài nguyên và tài nguyên được sử dụng để chỉnh sửa tài nguyên là giống nhau. –

+0

Được rồi, điều cần biết. Tôi đã cho rằng chúng sẽ luôn giống nhau. OP nên tính đến điều này. – smcg

7

Có một lý do cho không đặt vị trí (URL) của tài nguyên mới được tạo ra) trong cơ thể: URL là siêu dữ liệu cần thiết cho sự tương tác thông điệp của người tiêu dùng và các dịch vụ dịch vụ, nó không phải là "dữ liệu kinh doanh" . Có một mẫu thiết kế SOA được gọi là "Messaging Metadata" cho thấy rằng URL, thông tin xác thực bảo mật, số nhận dạng tương quan, ID giao dịch và dữ liệu ngữ cảnh và tin nhắn văn bản khác phải được đặt trong tiêu đề chứ không phải trong phần nội dung của thư. Thật vậy, http đã cung cấp vị trí tiêu đề chuẩn cho điều đó.

OTOH, nếu dịch vụ REST của bạn sử dụng HATEOAS, phản hồi có thể chứa một hoặc nhiều URL liên kết trực tiếp đến các hoạt động bạn muốn cung cấp để người tiêu dùng liên kết và gọi điện.

Tôi nghĩ rằng việc có URL trong cả tiêu đề và nội dung là giải pháp tồi tệ nhất. Dữ liệu dư thừa dễ bị mâu thuẫn trong thời gian dài.

Các vấn đề liên quan