2013-05-03 66 views
7

REST API的複數形式更自然,更多使用,例如/api/usersapi/users/123混合REST API複數和單數爲不同的資源?

但對於一些資源是不自然的。例如:

  • /api/login - 登錄確切一個用戶
  • /api/profile - 獲取登錄的用戶的個人資料

這個資源永遠不會被用於更多在我的應用程序中的一個對象/模型。

另一方面,我讀到混合複數和單數形式在資源名稱是不好的做法(http://pages.apigee.com/web-api-design-ebook.html)。

所以我認爲做什麼:

  1. 使用奇異所有
  2. 使用多種對所有(有一些愚蠢的格式,如:/api/logins
  3. 是不一致的,並使用複數幾乎所有資源的預期一些特殊資源,如/api/login/api/profile,它們總是與一個對象/模型一起使用。

什麼是更好的方法?

+0

我遵循與數據庫表相同的規則:單數。這是產品表,而不是產品表。你得到一個產品或一套產品。沒有必要用你的名詞來處理變調;你得到一個實體或一組實體。 – 2016-09-07 00:51:32

回答

6

對於定義RESTful API沒有嚴格的指導原則,但我讀到的最多的是常識應該佔上風。

因此,選項3:

是不一致的,並使用複數的幾乎所有資源期待一些特殊資源,如/ API /登錄或總是與一個對象/模型中使用/ API/profile文件。

是最合乎邏輯的。當你認爲「我需要資源X,這個URL將如何」時,你應該始終能夠猜出URL?

2

REST(具象狀態傳輸)基本上針對單個實體並對其進行CRUD。所以使用單數對我來說更有意義。但是如果你需要得到清單,那麼複數是有意義的。例如:

你想那麼用戶有/ API /用戶/ {ID}

但是,如果你想獲得用戶的列表,然後有/ API /用戶

+0

事實上的標準是使用GET/entity?filter =多個和GET/entity/{id}作爲單個。您的實體沒有降級要求;你會得到單數實體或實體集合/列表/系列。它本身不是「實體」,而是實體集合,列表或系列。 – 2016-09-07 00:55:09

3

我不是說我更喜歡複數形式,但是如果您使用複數形式,可以通過以下方式協調您的特殊單數形式:

GET /api/forms/login是HTML登錄表單。使用這種觀點,login是表單集合中的一種形式的ID。

POST /api/forms/login是提交登錄表單的地方。

GET /api/users/{id}/profile檢索指定用戶的配置文件。這適用於很多情況,但不適用於匿名網站,即使在查看用戶個人資料時用戶的身份應保持隱藏狀態,這可能會遺漏用戶ID和真實姓名。

GET /api/profiles/{id}將配置文件實體從用戶標識中分離出來,並可用於匿名網站。

或者,您可以編寫GET /api/users/current/profileGET /api/sessions/current/profile,由於服務器將回復與當前用戶相關的內容,因此會忽略特定的ID,如在您的帖子中。

2

我在一些項目中,我一直工作在這些年來見過那是什麼奇異的外觀爲最常見的操作更加友好,你可以有例如用於用戶資源的以下端點:

GET /user --> retrieves all users 
GET /user/{id} --> retrieves a user with the given id 
POST /user --> inserts a new user (the user object will come in the request body) 
PUT /user/{id} --> updates a user with the given id (the user object will come in the request body) 
DELETE /user/{id} --> deletes the user with the given id 

這些都是常見的操作,當你有批量插入/更新/刪除操作,那麼它應該是更好地使用複數

POST /users (the user objects will come in the request body) 
PUT /users/{listOfIds} (the user objects will come in the request body) 
DELETE /users/{listOfIds} 

GET /用戶和GET /用戶將是同義詞,這兩個會接受查詢參數改進結果,例如

GET /users?status=active 
+0

爲什麼GET/users不能檢索所有用戶? – 2015-07-15 18:31:27

+0

是的GET /用戶應該被用作GET/user的同義詞,在上面提到的方法中,我只是添加了該評論 – raspacorp 2015-07-15 21:50:12