用于数据处理和方法链接的REST API

ahm*_*med 11 rest web-services restful-architecture

如果质量问题不好,我会提前道歉.我仍然开始学习REST API的概念.我正在尝试实现可扩展的REST API以进行数据处理.这是我到目前为止所能想到的.

考虑一些可以使用GET调用检索的数字数据:

GET http://my.api/data/123/
Run Code Online (Sandbox Code Playgroud)

用户可以应用一系列算术运算,例如addmultiply.一种非RESTful的方法是:

GET http://my.api/data/123?add=10&multiply=5
Run Code Online (Sandbox Code Playgroud)

Assupmtions:

  • DB中的原始数据不会更改.仅将其更改版本返回给用户.
  • 数据大小很大(比如一个大的多维数组),所以我们不能在每次操作调用时返回整个数据.相反,我们希望将操作作为批处理应用,并最终返回最终修改的数据.

我目前有2种RESTful方式可供选择:

1.将算术运算模型化为数据的子资源.

如果我们考虑add作为这里multiply的数据的子资源.在这种情况下,我们可以使用:

GET http://my.api/data/123/add/10/
Run Code Online (Sandbox Code Playgroud)

鉴于原始数据永远不会改变,这将是安全和幂等的.但是,我们需要链接多个操作.我们可以这样做吗?

GET http://my.api/data/123/add/10/multiply/5/
Run Code Online (Sandbox Code Playgroud)

在哪里multiply创建一个子资源,add/10/它本身就是一个子资源data/123

优点:

  • 无状态:服务器不保留有关已修改数据的任何信息.
  • 轻松访问修改后的数据:这只是一个简单的GET调用.

缺点:

  • 链接:我不知道它是否可以轻松实现.
  • 长URI:应用每个操作后,URI会越来越长.

2.创建可编辑的数据对象:

在这种情况下,用户创建原始数据的可编辑版本:

POST http://my.api/data/123/
Run Code Online (Sandbox Code Playgroud)

将返回

201 Created
Location: http://my.api/data/123/edit/{uniqueid}
Run Code Online (Sandbox Code Playgroud)

用户可以使用PATCH此可编辑数据

PATCH http://my.api/data/123/edit/{uniqueid}
{add:10, multiply:5}
Run Code Online (Sandbox Code Playgroud)

最后,GET编辑数据

GET http://my.api/data/123/edit/{uniqueid}
Run Code Online (Sandbox Code Playgroud)

优点:

  • 清理URI.

缺点:

  • 服务器必须保存编辑数据的状态.
  • 编辑不再是幂等的.
  • 获取编辑数据需要用户至少拨打3个电话.

是否有更清晰,更语义的方式来实现RESTful数据处理?

编辑:

如果你想知道这背后的现实问题是什么,我正在处理数字信号处理.

举个简单的例子,您可以考虑将可视过滤器应用于图像.在此示例之后,RESTful Web服务可以执行以下操作:

GET http://my.api/image/123/blur/5px/rotate/90deg/?size=small&format=png
Run Code Online (Sandbox Code Playgroud)

Oli*_*ray 4

您的问题中有几件事值得回顾。

\n\n

基于 REST 的 API\xe2\x80\x99s 是基于资源的

\n\n

因此,看看您的第一个示例,尝试将转换属性链接到资源标识符后面的 URL 路径中。

\n\n

GET http://my.api/data/123/add/10/multiply/5/

\n\n

..不太适合(正如您已经猜到的那样,动态实现也很复杂)

\n\n

无国籍状态

\n\n

REST 中的无状态理念是围绕单个 HTTP 调用构建的,该调用包含足够的信息来处理请求并提供结果,而无需返回客户端获取更多信息。在服务器上存储HTTP调用的结果不是状态,它\xe2\x80\x99s缓存。

\n\n


\n现在,鉴于基于 REST 的 API 可能不是最适合您的使用,如果您仍然想使用它,这里有您的选择:

\n\n

1. 将Querystring与普通URL操作一起使用

\n\n

您可以使用查询字符串,但简化资源路径以接受单个 URI 上的所有转换。鉴于您的示例并且不愿意存储转换后的结果,这可能是您的最佳选择。

\n\n
GET http://my.api/data/123/transform?add=10&multiply=5\n
Run Code Online (Sandbox Code Playgroud)\n\n

2.非REST方式使用POST

\n\n

您可以使用 POST 请求,并利用 HTTP 正文发送转换参数。如果您决定执行大量操作,这将确保您不会\xe2\x80\x99 耗尽查询字符串的空间,并且还将使您的通信更加整洁。如果 POST 返回图像数据,则这\xe2\x80\x99 不被视为 RESTful。

\n\n

3. 充分使用 POST REST

\n\n

最后,如果您决定确实想要缓存内容,您的 POST 实际上可以存储转换后的对象(请注意,REST\xe2\x80\x99t 不规定如何存储它,在内存或数据库等中),可以重新存储- 使用 GET 通过 Id 获取。

\n\n

选项A

\n\n
\n

POST 到 URI 会创建一个从属资源。

\n
\n\n
POST http://my.api/data/123\n{add:10, multiply:5}\n
Run Code Online (Sandbox Code Playgroud)\n\n

回报

\n\n
201 Created\nLocation: http://my.api/data/123/edit/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后获取编辑后的数据

\n\n
GET http://my.api/data/123/edit/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n

选项B

\n\n
\n

从 URL 中删除资源标识符,以明确您正在创建一项新项目,而不是更改现有项目。生成的 URL 也与原始 URL 处于同一级别,因为假定它是相同类型的结果。

\n
\n\n
POST http://my.api/data\n{original: 123, add:10, multiply:5}\n
Run Code Online (Sandbox Code Playgroud)\n\n

回报

\n\n
201 Created\nLocation: http://my.api/data/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后获取编辑后的数据

\n\n
GET http://my.api/data/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n