假設我們在一個專案管理SaaS的User模型和Project模型之間有一個M:M關系。當然,我們有一個將用戶映射到專案的透視表。如果用戶離開,或者如果專案經理將該用戶從專案中洗掉,則該條目將被洗掉。
盡管最終結果基本相同(即條目被洗掉),但我認為通過定義兩個獨立的 API 端點來區分這兩個動作會更好,如下所示:
用戶離開專案
用戶離開專案?
用戶離開專案 路線 動作 專案管理員洗掉用戶 路線 動作 我是否應該忽略Cruddy by Design和RESTful設計原則,簡單地定義 uj5u.com熱心網友回復: 如果 管理關于 已被呼叫。 FWIW, 看起來它正在洗掉 為了與領域模型保持一致。 然而,僅僅使用 您將不得不考慮 uj5u.com熱心網友回復: 需要考慮的是:你將如何在網路上進行操作?
DELETE /users/{id}/projects/{id}UserProjectController@destroy($id) 其中$id指的是專案DELETE /projects/{id}/participants/{id}ProjectParticipantController@destroy($id) 其中$id指的是用戶leave() join() remove()動作,并在URI中使用動詞?
POST /projects/{id}/joinPOST /projects/{id}/leavePOST /projects/{id}/participants/{id}/removejoin,leave,remove可以說是RPC而不是REST。資料透視表等是域的實作方式,與API的呼叫者無關,它在域的層面上作業。這些 URL 如何映射到您的域模型中?
Project有一個或多個User,為什么不直接使用/projects/{id}/
專案和參與者實體的一切?User在一個Project中,但只有當/projects/{id}/participants/{id}。
DELETE /users/{id}/projects/{id}
Project實體,該實體由User擁有,因為Project物件有participants,但User并沒有使用該術語。也許應該是:DELETE /users/{id}/projects/{id}/participants
Project來管理Project實體似乎要容易得多。使用User API從Project中移除User似乎是一種便利,它使后臺變得復雜,并且與Project術語并不匹配。這將意味著只有UserController和ProjectController類。Participant id是否與User id相同,以及透視表是否處理這個問題,但這不會影響API。API應該是你的領域模型的直觀表示。
盡管最終的結果基本上是相同的(即條目被洗掉),我想最好是通過定義兩個獨立的API端點來區分這兩個動作
POST /foo
Content-Type: application/x-www-form-urlencoded
action=UnsubscribeUser&otherArguments....
POST /foo
Content-Type: application/x-www-form-urlencoded
action=CancelProject&otherArguments....
"一種資源或兩種資源 "并不是一個正確或錯誤的問題,而是一個權衡的問題。
POST /projects/{id}/join
POST /projects/{id}/leave
POST /projects/{id}/participants/{id}/remove
這也是 "好的";同樣,這是一個交易的問題。 機器并不關心你的識別符號在URI中是否有一個動詞。
它們在某種程度上關心讀取的識別符號是否與寫入的識別符號相同。 參見RFC 7234。
但是我們完全可以說,在訪問日志或瀏覽器歷史中擁有具有語意意義的URI拼寫比快取驗證對我們的長期成功更為重要。
請牢記,HTTP中的DELETE與SQL中的DELETE含義不同;我們談論的是兩個不同的名稱空間,有各自的語意。
HTTP DELETE屬于通過網路傳輸檔案域。 你的處理程式的實作包括一個SQL DELETE的事實是完全不相關的。
允許使用 DELETE 方法的資源相對較少 -- 其主要用途是用于遠程創作環境,在這種環境中,用戶對其效果有一些指導。
使用POST
是OK。轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/309952.html
標籤:
上一篇:從一個介面到另一個介面的地圖
