2009-10-26 18 views
25

比方說,我們有一個服務來添加一個新的酒店:如何在RESTful POST中返回生成的ID?

> POST /hotel 
> <hotel> 
> <a>aaa</a> 
> <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
> </hotel> 

然後我們有一個GET:

> GET /hotel 

< HTTP/1.1 200 OK 
< <hotel> 
< <a>aaa</a> 
< <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
< </hotel> 

的問題是什麼我們返回初始POST創造?我們想要返回一個「引用」到新資源的ID(在服務器上生成),但我們不想返回所有酒店數據,因爲在我們的情況下,其中一個數據字段是一個大約300K的平面文件。

所以你應該剛剛返回:

< HTTP/1.1 200 OK 
< <hotel> 
< <id>123</id> 
< </hotel> 

還是應該返回完整的對象:

< HTTP/1.1 200 OK 
< <hotel> 
< <id>123</id> 
< <a>aaa</a> 
< <b>aaa</b> 
> <c>aaa.......this is 300K</c> 
< </hotel> 

我對寧靜的最佳實踐感興趣。

注意:這個相關的post會談到更多關於返回的內容,而不是關於如何返回它。

回答

40

返回狀態碼201 - 創建,並將URL放在位置標題中。你根本不需要返回一個身體。

+2

回答要了解如何設置位置標題: http://www.java-forums.org/blogs/spring-framework/544-restful-post-method-spring.html – db42 2012-07-26 06:01:00

12

REST全部是關於URL的資源。

最好的RESTful實踐是返回用於訪問剛剛創建的資源的URL。

我不會返回整個文檔。除非協議出於某種原因(例如,服務器可能會更改客戶端提交的數據並且客戶端想確認它是否正常),這對協議很重要。如果不重要,客戶端已經知道數據。

如果您只返回ID,客戶端將不知道如何處理它。但是,返回一個URL將允許客戶端繼續與服務器進行REST交互(可能是通過獲取服務描述文檔)。這並不是說你不能將URL和URL一起返回。但是,因爲它是一個網絡系統,所以URL是你可以知道的最重要的信息。此外,ID很可能是您在後端需要的內容,而不是客戶應該擔心的事情。

編輯:
至於你是否應該用XML包裝返回的URL,它真的取決於你的協議。如果您認爲將來可能要返回其他數據,那麼XML將更加謹慎。擁有一個命名的文件格式可以讓你更好地版本化你的服務(通過改變文檔類型頭文件)。但是你可以返回URL。

+1

你只會將它作爲「/ hotel/123」返回?你會用XML包裝嗎? – 2009-10-26 14:16:37

+0

根據「編輯」 – 2009-10-26 14:43:54

10

返回位置標題的一個優點響應的實際實體主體是客戶端可以在服務器的單次往返中接收結果表示。例如,AtomPub這樣做。

相關問題