2014-07-25 42 views
1

提前抱歉問「什麼是將某些功能操作塞進REST式思維方式的最佳方式」問題。這裏無意展開辯論;我想看看是否有一個可接受的模式來完成特定任務。如何在RESTful服務中實現「查找或創建」操作?

假設我想在API中爲端點創建用戶/關聯對的「推薦代碼」。我可以做

POST /referral_codes 
{"user":1, "affiliate":88} 

並使用201 CREATED和一個新代碼的身體作出響應。

但是,如果代碼已存在,我會退還現有的推薦代碼。在這種情況下,201是不合適的(沒有創建任何東西)。 200 OK可能是有道理的,409 CONFLICT是有意義的,如果你極大地延伸了409的意圖 - 但要求一個已經存在的代碼並不是一個錯誤,我試圖模仿的操作被稱爲「查找或創建」。

另一種選擇是使端點成爲GET(即GET /referral_codes?customer=1&affiliate=88),因爲客戶端不需要知道服務器是否必須創建資源來完成請求。而且由於它仍然是冪等的(隨後的調用將返回第一次創建的代碼),我沒有做任何一個Restafarian會反對的東西,或者我會做什麼?

是否存在「查找或創建」的接受模式?

+0

查找通常是GET並且創建通常是POST,因此您不會以REST方式對此操作進行建模。我會把它分成2個請求,或者給操作提供一個更好的名字...... 正如Will寫道,POST是你唯一的選擇,因爲afaik是用於你將用新的HTTP方法建模的操作。 – inf3rno

回答

4

我會POST和200與現有資源的位置。語義很簡單。

至於GET選項,它只是第二次冪等,第一次,實際上是創建資源。

你可以告訴你,如果你有任何類型的聚合資源會「獲得所有狀態」,你會發現新的不存在,但如果你直接獲取它,Shazam就是IS ,那是一個錯誤。

在這種情況下,使用200開機自檢是最有效的,我想。

+0

這是一個很好的見解。我的確有'GET/referral_codes'來獲取所有代碼,每個代碼的格式爲{{customer':x,「affiliate」:y}'。而你的場景顯示GET創建將是一個錯誤。好理由! –

相關問題