2010-11-02 58 views
2

如果有Foo類型的具有獨特的ID 36在位置處的資源:HTTP:部分更新資源(接受空字符串)的模式?

http://example.com/foo/36 

和一個Foo包含幾條可變數據(var1var2等),其中一些串的;

通過HTTP更新資源變量的部分集合的首選模式是什麼(假設我們可能希望將某些變量設置爲空字符串)?

(問題是空字符串的表單值是not considered "successful" by the W3C standard,不需要由瀏覽器提交,如果沒有發送空值,服務器不知道我們想要設置該變量。爲空字符串)

我想過以下選項:

  1. POSThttp://example.com/foo/36與具有「成功」的值的變量名稱/值對的列表,以及一個額外的參數,其值是我們希望設置爲空格的逗號分隔值列表y字符串。

  2. PUThttp://example.com/foo/36/var1;var2;var3,指定了我們想要作爲URI的一部分更新的一組完整值。任何未作爲PUT參數接收的指定名稱將被設置爲空字符串。

  3. http://example.com/foo/36/var1http://example.com/foo/36/var2發送單獨PUT請求每個變量,等發現每一個變量作爲一個單獨的資源(很明確,但涉及大量的請求)。

但是,這些都不是直觀,優雅或標準的我。

+0

你的問題的一部分聽起來像你被限制在HTML表單。但是,在這種情況下,無論如何您都被限制爲POST。對? – 2010-11-02 17:47:03

+0

我不想限制我的應用程序瀏覽器,所以我更願意明確地實現其他方法。爲了適應瀏覽器,我使用了「超負載POST」的非官方常見做法:允許'POST'請求​​提交一個名爲「method」的屬性,其值爲「'PUT'」,「'DELETE'」等。 – 2010-11-02 18:03:18

回答

2

你提到的方法是繞過你提到的參數限制的好主意,但它們不是那個標準。以爲你應該API是客戶友好,我會去比較常見的方法來使用資源的格式,如JSON或XML:

  • 他們更「明確的」域數據的表示
  • 就能呈現空值更好(例如空或不存在的XML標籤)。

瀏覽器可以通過JSON格式的AJAX發送數據。

用於創建一個你要發送完整的內容:


POST /foo 
... 
{"var1":"x","var2":2,"var3":"hello"} 

(部分)更新時間:


PUT /foo/123 
... 
{"var1":"y","var2":null} 

在局部更新 「VAR3」 將被保留。

對於更新,我寧願總是發送完整的數據(不像上面那樣部分),因爲它簡化了映射+實現。但有些情況下需要部分更新。

+0

這很有趣;我沒有考慮過使用JSON。但我是否認爲沒有辦法從瀏覽器表單發送像這樣的數據而不使用Javascript?我真的想盡可能使我的應用程序可以訪問所有類型的客戶端。 – 2010-11-03 12:18:29

+0

瀏覽器內部的正常形式(即基於非js/ajax)正在發送MIME類型的應用程序/ x-www-form-urlencoded(請參閱http://www.w3.org/TR/html401/interact/forms.html# H-17.13.4.1)。這對於「普通」的web應用程序來說工作得很好,但它不是真正的api友好格式(請參閱您的示例)。困難......如果你不想使用JavaScript,我的建議是模塊化你的後端,所以在基於瀏覽器的HTTP端點和「真正的」API之間共享代碼更容易。你有什麼樣的網絡應用程序?也許http://www.sencha.com/products/js/可能是一個選項(api-backend是核心概念)。 – 2010-11-03 19:12:26

+0

經過大量測試和審議後,我決定限制非JavaScript瀏覽器一次更新整個資源,並允許使用JSON爲JavaScript和非瀏覽器客戶端POST POST部分資源。感謝您的正確方向! – 2010-11-10 18:33:51

0

我會做的是稍微修改PUT語義,以便只有發送的值/對在資源中更新:如果資源不存在,請使用PUT請求中的信息創建它;如果資源存在,則僅更新傳遞的名稱/值對。

我甚至認爲部分更新對於其他架構來說是一個很好的補充。只需使用一些HTTP頭來表示它。

+0

但這不允許我將資源的變量設置爲空字符串。一個空字符串不需要由瀏覽器發送(請參閱問題中的鏈接),因此無法確保將其包含在名稱/值對中。 – 2010-11-03 12:15:30