2013-05-08 32 views
7

我正在設計一個簡單的CRUD REST API。這是我第一次,所以我想獲得一些關於我的設計是否合理的反饋。如何設計一個簡單的CRUD REST API

我正在使用HTTP方法:GET,POST,DELETE和UPDATE。 API將以JSON格式消費和獲取數據。樣本URL將是像這樣的:

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

問題

POST請求的記錄將在數據庫中創建後。那麼,POST請求是否應該返回新創建的記錄的ID?那麼這個ID可以用在UPDATE, DELETE and GET (single item)

+0

這取決於你如何設計你的休息服務。雅,一個POST請求可以接收響應主體。 – Joshi 2013-05-08 11:03:38

+0

謝謝,是的,我知道POST可以接收一個body。但是,我可以在處理完請求後發送回覆,例如說新創建的記錄的ID爲659 – birdy 2013-05-08 11:07:34

+0

是的,如果這些ID與數據庫同步,那麼可以使用這些ID。 – Joshi 2013-05-08 11:09:12

回答

5

HTTP specification定義以下爲POST:

如果資源已經在源服務器上創建的,則響應應該是201(創建)和包含其描述了請求的狀態,並且是指一個實體新資源和位置標題(請參閱第14.30節)。

因此,這實際上意味着:

  • 您應該返回201 Created的狀態代碼
  • 您應該返回Location頭,指向新創建資源的URI
  • 您可以選擇包括資源在POST響應主體中的表示,以免除客戶端必須針對從Location頭獲得的值發出另一個GET請求。
+0

不錯。所以第三個子彈意味着我可以簡單地返回新創建的ID。 – birdy 2013-05-08 11:41:16

+4

No.首先,URI *是ID(因此是名稱)。其次,我寫了「資源的表示形式」,這意味着如果您按照「位置」標題中的鏈接進行操作,就會得到基本相同的結果,請閱讀:您最初在您的案例中發送的JSON。 – 2013-05-08 12:13:16

1

POST應該返回一個重定向到單個項目的新url。

您可能想要放棄url的版本標識符。

而是以一種可以優雅地處理各種版本的方式來設計您的表示和客戶端。例如,客戶端不應該依賴於特定的格式,而只能依賴其實際需要的屬性。

你的描述中缺少什麼是HATEOAS原則,即客戶端不應該對任何URL進行硬編碼,而是在其他實體的表示中查找進一步操作的URL。由於您沒有爲網址返回的結果顯示示例文檔,因此我們無法判斷您是否以很好的方式實現了這一點。

檢查出this presentation,它解釋了這個話題,還提到了一些Spring Library對實現它有幫助。

+0

謝謝,我不知道HATEOAS原則。順便說一句,即使標籤丟失我正在使用grails來實現這一點。我會添加標籤。所以,不要只返回ID,帖子應該返回單個項目的完整URL,即'http:// /myapp/rest/v1/colors/2' – birdy 2013-05-08 11:26:13