uri - 如何最好地构建 RESTful API 端点

标签 uri restful-architecture api-design

我正在努力将我的应用程序从紧密耦合的 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/

相关文章:

android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件

ruby - Json 到 url 编码 ruby

rest - REST 架构中的分页

c++ - 私有(private)类函数与未命名命名空间中的函数

c++ - 在命名空间声明之后声明 using 语句

android - URI 和位图图像之间的区别

http - URI 中 (./) 的含义?

javascript - JS框架能够基于(django)rest api选项生成表单

php - 使用 php 创建 API 时的 RESTful API 设计模式

java - 为什么 Robot.delay(int ms) 限制为 1 分钟?