2017-04-10 65 views
1

我正在通过将应用程序从紧密耦合的PHP实现转换为RESTful实现。 (目前的应用程序在http://coinvault.tanichols.com如何最好地构建RESTful API端点

该应用程序保持硬币(国家宿舍,总统美元等)和用户的集合。用户还可以“收集”硬币,表示为用户和硬币表之间的多种关系。

我创建的动词和端点的组合如下表:

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:这是一个更好的办法,还是坏?这是否会给/币路线增加不必要的“重量”?

最后,出于报告和分析目的,我希望提供对某些聚合的访问权限,例如特定硬币被收集了多少次。对于这一个,我完全丧失了从哪里开始,或者如何解决这个问题。

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

回答

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 /东西/ TID。

Q2:

为此建议:

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

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

Q3:

这不是聚集的问题,这些数据绑定到一个硬币,所以你可以简单的GET /coins/CID数据内归还。 乘法端点绝对不是一个好主意,特别是如果这些数据总是需要的话。

+0

谢谢@arnaud,你对第三个问题的回答确实为我解决了一些问题。我一直忘记我可以将任何我想要的数据返回给响应,而不仅仅是表中的内容。例如,我可以在JSON中发送一个totalCollected值,即使这不在表格中。谢谢你清理那个。 – ThomasNichols89