來自亞馬遜的高級工程師James Hood以簡單明了的例子說明了為什么要用DDD替代CRUD來設(shè)計REST API。
REST以資源為中心,這些資源以URI的形式呈現(xiàn)。在調(diào)用HTTP時,通過指定一個HTTP動詞和一個資源URI對某個特定的資源進(jìn)行操作。大部分REST框架都提供了生成器,你只要指定一個資源的名字,框架就會為你生成腳手架(scaffold)。不過,這些生成器默認(rèn)使用的是CRUD模型(Create、Read、Update、Delete),它們把資源看成是一系列屬性的集合,使用JSON或與特定語言相關(guān)的數(shù)據(jù)對象來表示資源,并生成用于對資源進(jìn)行創(chuàng)建、讀取、更新和刪除操作的方法。
雖然這給開發(fā)者帶來了便利,但我覺得這樣是有問題的。我不喜歡CRUD這樣的說法,尤其不喜歡當(dāng)中的U。一般的更新操作允許客戶端更新資源的任何一個字段,并使用新版本覆蓋已有的版本。但如果你允許客戶端這么做,那么你的服務(wù)API就失去了應(yīng)有的價值。服務(wù)層的一個關(guān)鍵價值在于為底層的數(shù)據(jù)增加業(yè)務(wù)約束,因此,資源最終都需要帶上業(yè)務(wù)約束。