2015-08-21 55 views
2

在RESTful API(以HTTP方式)中表示一次性可寫資源的慣用方式是什麼?在CRUD術語中,應該可以創建資源但不允許更新?RESTful API - 一次性寫入資源

編輯:

我想補充的澄清下面Rosenheimer的答案的評論。我希望允許客戶端指定URL而不是由POST處理程序生成。

+0

你會使用什麼樣的約定? PUT ./resources/{id}創建? – mathk

+0

我覺得我更喜歡'PUT'到'POST',因爲它感覺語義上更好。但我懷疑「一次寫入」語義並不是冪等的。 –

+0

是的你是對的。沒有明顯的迴應你的問題。您始終可以使用4xx響應狀態進行回覆。但從客戶角度來看,這並不容易。因此,我建議您僅使用POST進行創建並禁止PUT/PATCH。 – mathk

回答

0

如果之前資源不存在(表示「一次寫入」實際上是資源的「創建」),那麼只需調用父項即可,如POST,如下所示:POST example.com/Resources發送資源。 稍後,不要允許PUTPATCH到位於example.com/Resources/123的特定資源,其中123將是資源的標識符。

因此,該資源可以寫入一次,但以後不能更改。

+0

同意「一次可寫」實際上是「創作」。 但我希望客戶端能夠指定URL - 即客戶端是否可以說「在此特定URL上創建資源或在該URL已被佔用時失敗」? 在POST正文中指定URL並不困難,但我想知道是否可以純粹用HTTP來表示它。 –

+0

當然,您也可以像前面所說的那樣,在資源本身中包含資源的標識符(作爲正文中對象的屬性),或者將其包含爲像這樣的URL參數:POST example.com/Resources ?ID = 123;然後這可以用201-創建或423-鎖定來響應 – GeorgDangl

0

您可以使用HTTP狀態405 Method Not Allowed403 Forbidden來禁止後續更新。

資源創造一些使用POST

# C of CRUD 
POST ./phones -> 200 OK with the id of the object created 
# R or CRUD 
GET ./phones/{id} 
# U of CRUD 
PATCH/PUT ./phones/{id} 
# D of CRUD 
DELETE ./phones/{id} 

一些可以使用PUT創建對象,但使用PUT的問題是,該方法具有客戶端2含義。

+0

PUT具有將被調用的URI所引用的實體替換爲在請求內找到的有效載荷的語義 - 沒有什麼更多的了。如果實體還不可用,只有'PUT'具有與'POST'類似的語義,儘管它仍然用請求中找到的內容「替換」當前內容。 –

+0

@RomanVottner是當使用PUT創建資源並替換資源時,仍然存在2種不同的事情。在同一個方法中同時具有語義的同時給了很多麻煩。從客戶角度來看,行爲不太清楚。 – mathk

+0

不!語義只是將請求中應包含的內容替換爲請求中包含的內容。如果有更新或創建與'PUT'不相關。效果是重要的。在請求結束時,被調用的URI表示的資源必須具有請求主體的內容。 –

0

我認爲正確的做法是接受PUT方法首次保存資源並在任何後續嘗試更新已有資源時返回409衝突HTTP狀態碼。

+0

雖然'PUT'應該是這樣,這不是冪等的。 –

+0

我收回。似乎沒有擴展到響應代碼。但是,我認爲在PUT正文與當前內容匹配的情況下,返回204會更好,而不是失敗。 –