【发布时间】:2015-10-14 04:01:20
【问题描述】:
如果问题质量不好,我提前道歉。我还在开始学习 REST API 的概念。我正在尝试为数据处理实现可扩展的 REST API。到目前为止,这是我能想到的。
考虑一些可以使用GET 调用检索的数字数据:
GET http://my.api/data/123/
用户可以应用一系列算术运算,例如add 和multiply。一种非 RESTful 方式是:
GET http://my.api/data/123?add=10&multiply=5
假设:
- 数据库中的原始数据没有改变。只会将修改后的版本返回给用户。
- 数据很大(比如一个大的多维数组),所以我们不能在每次操作调用时都返回整个数据。相反,我们希望将操作作为批处理应用并最终返回最终修改后的数据。
我目前正在考虑两种 RESTful 方式:
1。将算术运算建模为数据的子资源。
如果我们将add 和multiply 视为数据as here 的子资源。在这种情况下,我们可以使用:
GET http://my.api/data/123/add/10/
这将是安全和幂等的,因为原始数据永远不会改变。但是,我们需要链接多个操作。我们可以这样做吗?
GET http://my.api/data/123/add/10/multiply/5/
multiply 正在创建add/10/ 的子资源,而data/123 本身就是data/123 的子资源
优点:
- 无状态:服务器不保留有关修改数据的任何信息。
- 轻松访问修改后的数据:这只是一个简单的 GET 调用。
缺点:
- Chaining:不知道能不能轻松实现。
- 长 URI:每次应用操作后,URI 都会变得越来越长。
2。创建一个可编辑数据对象:
在这种情况下,用户创建原始数据的可编辑版本:
POST http://my.api/data/123/
将返回
201 Created
Location: http://my.api/data/123/edit/{uniqueid}
然后用户可以PATCH这个可编辑的数据
PATCH http://my.api/data/123/edit/{uniqueid}
{add:10, multiply:5}
最后,GET 编辑的数据
GET http://my.api/data/123/edit/{uniqueid}
优点:
- 清理 URI。
缺点:
- 服务器必须保存已编辑数据的状态。
- 编辑不再是幂等的。
- 获取已编辑的数据需要用户至少拨打 3 次电话。
是否有一种更简洁、更语义化的方式来以 REST 方式实现数据处理?
编辑:
如果您想知道这背后的现实问题是什么,我正在处理数字信号处理。
作为一个简单的示例,您可以考虑将视觉过滤器应用于图像。在this example 之后,一个 RESTful Web 服务可以做到:
GET http://my.api/image/123/blur/5px/rotate/90deg/?size=small&format=png
【问题讨论】:
-
为什么“GET my.api/data/123?add=10&multiply=5”不是RESTful?这假设没有状态
-
嗯,这取决于你如何解释它。我看到
add和multiply修改了资源,而不是 scoop 它。我认为查询字符串应该保留用于例如GET http://my.api/data/123/add/10/?subset_from=0&subset_to=10中的挖掘。 -
@ahmohamed,这是一个真正的问题吗?
-
@Opal 当然。我的应用程序涉及信号处理。我已经编辑了这个问题来证明这一点。
-
为什么不想/不能保留修改后的数据?
标签: web-services rest restful-architecture