我正在努力将我的应用程序从紧密耦合的 PHP 实现过渡到 RESTful 实现。 (当前应用程序位于 http://coinvault.tanichols.com)
该应用维护着一组硬币(州 25 美分硬币、总统美元等)和用户。用户还可以“收集”硬币,表示为用户和硬币表之间的多对多关系。
我创建了下表的动词和端点组合:
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
问题 2: 这种方法是更好还是更糟?这会给/coins 路由增加不必要的“重量”吗?
最后,在这种情况下,我想提供对某些聚合的访问,例如收集特定硬币的次数,以用于报告和分析目的。对于这个,我完全不知道从哪里开始,或者如何解决这个问题。
问题 3: 如何通过 RESTful API 公开此类聚合?对此有意义的路线是什么?
最佳答案
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 最佳实践。
问题 3:
这不是聚合的问题,这些数据绑定(bind)到一个币,因此您可以简单地在 GET/coins/CID
的数据中返回它们。
将端点相乘绝对不是一个好主意,尤其是在始终需要这些数据的情况下。
关于uri - 如何最好地构建 RESTful API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334556/