我正在努力将我的应用程序从紧密耦合的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公开此类聚合?这有什么有意义的途径?
答案 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
的数据中返回它们即可。
乘以端点绝对不是一个好主意,特别是如果总是需要这些数据的话。