如果问题的质量不好,我会提前道歉。我还在开始学习 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
的子资源优点:
缺点:
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}
优点:
缺点:
是否有更简洁、更语义化的方式来实现 RESTful 数据处理?
编辑:
如果您想知道这背后的现实问题是什么,我正在处理数字信号处理。
作为一个简单的示例,您可以考虑将视觉过滤器应用于图像。关注 this example ,一个 RESTful Web 服务可以做:
GET http://my.api/image/123/blur/5px/rotate/90deg/?size=small&format=png
最佳答案
有多种方法可以做到这一点。最后它应该是干净的,不管你想给它什么标签(REST非REST)。 REST 不是一个带有 RFC 的协议(protocol),所以不要太担心你是否将信息作为 URL 路径或 URL 参数传递。无论数据如何传递,底层 Web 服务都应该能够为您获取数据。例如,Java Jersey 将为您提供参数,无论它们是参数还是 URL 路径,这只是一个注释差异。
回到您的具体问题,我认为此 REST 类型调用中的资源与其说是用于执行数字运算的数据,不如说是实际响应。在这种情况下,数据 ID 和操作是字段的 POST 可能就足够了。POST http://my.api/operations/
{
"dataId": "123",
"operations": [
{
"type": "add",
"value": 10
},
{
"type": "multiply",
"value": 5
}
]
}
正如您所指出的,响应必须指向可以检索结果的位置。由响应中的位置(和 ID)引用的结果本质上是一个不可变对象(immutable对象)。所以这实际上是 POST 创建的资源,而不是用于计算该结果的数据。它只是一种不同的观看方式。
编辑:为了回应您关于不想存储操作结果的评论,您可以使用回调将操作结果传输给调用者。您可以轻松地在 JSON 输入中为回调的主机或 URL 添加 a 字段。如果存在回调 URL,那么您可以将操作结果发布到该 URL。
{
"dataId": "123",
"operations": [
{
"type": "add",
"value": 10
},
{
"type": "multiply",
"value": 5
}
],
"callBack": "<HOST or URL>"
}
关于web-services - 用于数据处理和方法链接的 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116399/