2013-03-11 25 views
4

假設我們有集合/items/,我們要允許客戶端增加新項目到這個集合。通過Rails的啓發,我得出如下:我們只需添加資源/items/new,誰想要添加項目首先發出GET /items/new,接收空實體(可能與一些默認值設定)之一,然後充滿希望的領域和問題POST /items/創建新的文檔(實體),將其添加到收藏

  • 此方法適用於真正的REST API嗎?什麼可以改進/重做?
  • 如果突然這種做法是很好的(如果不是,反正):

    假設每個項目都有必填字段標題。回覆GET /items/new回覆默認值可能不太好。 在這種情況下有什麼更好?要返回null標題並且在POST空白時返回錯誤?要爲new資源實現類似構造器的邏輯,請求查詢字符串中的必填字段?還有別的嗎?

謝謝。

UPD。只是爲了澄清,使用new不是關於將「添加」分割爲「分配」和「寫入內容」,因爲沒有對數據存儲的操作在GET /items/new上完成。它意味着實現實體設計的靈活性:富客戶端可根據響應新事件而動態呈現輸入字段。那有意義嗎?或者合同是固定的,我們需要爲這樣的改變版本API?

回答

3

爲什麼首先返回一個空項目?我只是讓客戶端將新項目(包括其所有屬性)發佈到/ items/new。至少這是我記得在Rails中完成的方式;)

在任何情況下,額外返回一個空物品都沒有用處,增加了一個額外的網絡往返行程,並有可能通過拆分「添加」操作分爲「分配」和「寫入內容」。

如果你想做任何唯一性檢查,UID生成等,可以完成(或更好)一個「添加完整的項目」操作。

更新:混淆可能來自這樣一個事實,即rails控制器既充當REST API,又充當Web UI的控制器。這意味着某些操作在API(某些應用程序/代碼使用)中非常有用,有些操作因爲表示層(由人使用)需要它可以調用的某些內容而需要。 我不會真的認爲「新」動作在API中很有用,但用戶確實需要他可以調用的東西來獲取空表單。

+0

我同意。爲什麼要爲數據訪問服務提供類似於構造函數的功能。你可以把這些東西放在客戶端。 – lavrik 2013-03-11 16:52:32

+1

@creinig:在[Rails]中查看[this](http://guides.rubyonrails.org/getting_started.html#creating-new-posts)。它不會將「添加」到「分配」和「寫入內容」中,因爲沒有對數據存儲的操作在GET/items/new上完成。它意味着實現實體設計靈活性的一種方式:富客戶端可以根據響應「新」的動態呈現輸入字段。那有意義嗎? – starteleport 2013-03-11 17:07:51

+0

@starteleport:好的,有效的點。但是,如果這是需要的,它應該被明確地建模爲兩個單獨的動作。你鏈接的rails教程也是這樣(動作'新'和'創建')。它也允許在沒有前面的「新」的情況下調用「創建」。 – creinig 2013-03-11 17:43:37

2

通常當我創建一個REST API,我用的是實體名稱的單數形式,所以它的

api.company.com/item 

從那裏,如果客戶想是一個特定的項目,他們會做一個HTTP GET

api.company.com/item/{id} 

而且通常你不希望動詞在URL中。所以「item/new」是糟糕的設計。標準的HTTP方法應該是足夠的(GET,POST,PUT,DELETE)

所以對於你的情況,我建議不要做「項目/新」,只是讓客戶做一個HTTP POST到

api.company.com/item 

如果你在做XML,你可以給客戶一個XSD,以便他們知道需要或不需要。如果您使用的是JSON,它可能會在某個地方記錄下來。

至於執行所需的「標題」字段,我會驗證所有發佈到您的資源的新實體。我假設你有一個發佈數據映射到的域模型。你可以做你的驗證並返回一個狀態爲400的HTTP響應,或者你的API有自定義錯誤響應。

這裏有一個resource我看看漂亮往往記住HTTP狀態代碼及其含義

+0

請參閱主文章中的更新。它更好嗎?或者仍然是否定的? – starteleport 2013-03-11 17:41:56

+0

通常作爲API提供者,您不應該關注客戶端[(SoC)](http://en.wikipedia.org/wiki/Separation_of_concerns)顯示的默認值,這是客戶端的域。如果有默認值在某種程度上至關重要,那麼您可能會將您的文檔放在您的文檔中,以便客戶可以爲模板調用api.company.com/item/{someid}。但如果它不重要,你應該把它留給客戶。 – Khon 2013-03-11 19:13:06

相關問題