如何最好地构建RESTful API端点

时间:2017-04-10 23:45:31

标签: uri restful-architecture api-design

我正在努力将我的应用程序从紧密耦合的PHP实现转换为RESTful实现。 (当前应用http://coinvault.tanichols.com

该应用程序维护一组硬币(州宿舍,总统美元等)和用户。用户还可以“收集”硬币,表示为用户和硬币表之间的许多关系。

我创建了以下动词和端点组合表:

GET    /coins               - Get all coins 
POST   /coins               - Create a new coin
GET    /coins/CID           - Get a coin
PUT    /coins/CID           - Update a coin 
DELETE /coins/CID           - Delete a coin

GET    /users               - Get all users
POST   /users               - Create a new user
GET    /users/UID           - Get a user
PUT    /users/UID           - Update a user
DELETE /users/UID           - Delete a user

我遇到的问题是从许多表中公开信息的正确/可接受的方式。例如,我可以使用以下一组路线:

GET    /users/UID/coins     - Get coins for a user
POST   /users/UID/coins     - Create a coin for a user
GET    /users/UID/coins/CID - Get a specific coin for a user
PUT    /users/UID/coins/CID - Update a specific coin for a user
DELETE /users/UID/coins/CID - Delete a specific coin for a user

或者我可以将其反转为:

GET    /coins/CID/users/UID - Get a specific coin for a user
PUT    /coins/CID/users/UID - Update a specific coin for a user
DELETE /coins/CID/users/UID - Delete a specific coin for a user

Q1:其中一种比另一种更受欢迎?是否有标准或可接受的方式来规划这些类型的路线?

我还可以使用以下路由和过滤器公开此功能:

GET    /coins?user_id=1     - Get all coins belonging to a user

Q2:这是一种更好的方法,还是更糟?这会给/ coins路线增加不必要的“权重”吗?

最后,出于报告和分析目的,我希望提供对某些聚合的访问权限,例如计算特定硬币的收集次数。对于这个,我完全不知道从哪里开始,或者如何解决问题。

问题3:如何通过RESTful API公开此类聚合?这有什么有意义的途径?

1 个答案:

答案 0 :(得分:1)

<强> Q1:

您表示集合和项目的方式绝对有效,但您的第一个提案在您的上下文中有效:

GET    /users/UID/coins     - Get coins for a user
POST   /users/UID/coins     - Create a coin for a user
GET    /users/UID/coins/CID - Get a specific coin for a user
PUT    /users/UID/coins/CID - Update a specific coin for a user
DELETE /users/UID/coins/CID - Delete a specific coin for a user

如果某人属于某人,则用/ someones / SID / things / TID表示。

<强> Q2:

此提案:

GET    /coins?user_id=1     - Get all coins belonging to a user

绝对不是一个好主意,它违背了REST最佳实践。

<强> Q3:

这不是聚合问题,这些数据与硬币绑定,因此您只需在GET /coins/CID的数据中返回它们即可。 乘以端点绝对不是一个好主意,特别是如果总是需要这些数据的话。