2010-12-18 154 views
14

我知道HTTP PUT被存儲在一個特定的URI東西冪等請求,根據定義(從rfc報價)HTTP PUT請求通常如何發佈?

The PUT method requests that the enclosed entity be stored under the supplied Request-URI. 

但什麼是「封閉的實體」的定義是什麼?我似乎不可能發送表單數據(如HTTP POST請求)。通過JSON/XML或其他序列化格式發送實體的表示怎麼樣?

總之,如何發送HTTP PUT請求來存儲/更新特定URI的信息呢?

+0

http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services – W55tKQbuRu28Q4xv 2010-12-18 09:23:22

回答

10

封閉的實體是HTTP消息體中包含的有效載荷數據(在刪除任何傳輸編碼之後)。如果您無法發送消息正文,那麼可能是因爲忘記了包含內容-Length頭 - 這是表明HTTP消息具有主體的兩種方式之一。

除了這種語義差異,PUT與POST相同:使用POST,URI標識將處理實體的資源,例如servlet。使用PUT URI標識實體本身,例如將被創建/替換爲實體主體內容的文件。

10

在REST您有:

GET - retrieve resource 
POST - create new resource 
PUT - update existing resource 
DELETE - delete resource 

所以PUT動詞用於更新服務器上的現有資源。根據客戶端的不同,有多種發送PUT請求的方式。舉個例子,用jQuery AJAX:

$.ajax({ 
    type: 'PUT', 
    url: '/products/123', 
    data: { name: 'new product name' } 
}); 
+0

但是,如何發出HTTP PUT請求?是以正確的方式發佈在以下問題中的一個? http://stackoverflow.com/questions/2719610/should-i-allow-sending-complete-structures-when-using-put-for-updates-in-a-rest-a – Jeffrey04 2010-12-18 09:24:52

+1

@ Jeffrey04,這取決於什麼服務器期望。在這個例子中,你展示的是XML。但你也可以使用其他格式。我建議你觀看[關於使用REST for SOA的視頻](http://www.infoq.com/presentations/Using-REST-for-SOA)。 – 2010-12-18 09:26:09

+0

http://jcalcote.wordpress.com/2008/10/16/put-or-post-the-rest-of-the-story/很好地解釋了POST和PUT的不同用途。 IT使用依賴,而不是行動。 – 2014-06-27 15:34:07

2

您發送一個HTTP PUT,其中主體是您希望在請求的URL下存儲的'封閉實體'。與POST非常相似,它只是RFC中指定的語義不同。

+1

你介意加入一個例子嗎?謝謝 – Jeffrey04 2010-12-18 09:30:08

+0

也許您對此感到困惑:您實際上正在發送HTTP POST請求 - 您的Web瀏覽器不支持PUT。您在表單數據中傳入type = PUT,以便您的Web應用程序(即Rails)知道該怎麼做。 – 2010-12-18 16:11:04

+0

@Paul我實際上是通過php(zend_framework)開發一個寧靜的API網站,但我不知道PUT是如何實際完成的(因此問題),看起來不像表單輸入應該/可以使用。我的webserver和php腳本能夠處理PUT請求。 – Jeffrey04 2010-12-18 18:39:38

3

不知道這是正確的答案,但我可能只是嘗試

發出HTTP GET到http://example.org/api/foo/1後想,我得到這個

GET http://example.org/api/foo/1 
Accept: application/json 

響應:

{ 
    "foo": "bar" 
} 

然後發出放入請求

PUT http://example.org/api/foo/1 
{ 
    "foo": "baz" 
} 

只要端點上託管的應用程序能夠理解我發送的格式。

1

如果Request-URI指向一個已經存在的資源,封閉實體應該被認爲是駐留在原始服務器上的修改版本。如果Request-URI不指向現有資源,並且該URI可以被請求用戶代理定義爲新資源,則源服務器可以使用該URI創建資源。