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)
用户可以应用一系列算术运算,例如add
和multiply
.一种非RESTful的方法是:
GET http://my.api/data/123?add=10&multiply=5
Run Code Online (Sandbox Code Playgroud)
Assupmtions:
我目前有2种RESTful方式可供选择:
如果我们考虑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
优点:
缺点:
在这种情况下,用户创建原始数据的可编辑版本:
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)
优点:
缺点:
是否有更清晰,更语义的方式来实现RESTful数据处理?
如果你想知道这背后的现实问题是什么,我正在处理数字信号处理.
举个简单的例子,您可以考虑将可视过滤器应用于图像.在此示例之后,RESTful Web服务可以执行以下操作:
GET http://my.api/image/123/blur/5px/rotate/90deg/?size=small&format=png
Run Code Online (Sandbox Code Playgroud)
您的问题中有几件事值得回顾。
\n\n基于 REST 的 API\xe2\x80\x99s 是基于资源的
\n\n因此,看看您的第一个示例,尝试将转换属性链接到资源标识符后面的 URL 路径中。
\n\nGET http://my.api/data/123/add/10/multiply/5/
..不太适合(正如您已经猜到的那样,动态实现也很复杂)
\n\n无国籍状态
\n\nREST 中的无状态理念是围绕单个 HTTP 调用构建的,该调用包含足够的信息来处理请求并提供结果,而无需返回客户端获取更多信息。在服务器上存储HTTP调用的结果不是状态,它\xe2\x80\x99s缓存。
\n\n1. 将Querystring与普通URL操作一起使用
\n\n您可以使用查询字符串,但简化资源路径以接受单个 URI 上的所有转换。鉴于您的示例并且不愿意存储转换后的结果,这可能是您的最佳选择。
\n\nGET http://my.api/data/123/transform?add=10&multiply=5\n
Run Code Online (Sandbox Code Playgroud)\n\n2.非REST方式使用POST
\n\n您可以使用 POST 请求,并利用 HTTP 正文发送转换参数。如果您决定执行大量操作,这将确保您不会\xe2\x80\x99 耗尽查询字符串的空间,并且还将使您的通信更加整洁。如果 POST 返回图像数据,则这\xe2\x80\x99 不被视为 RESTful。
\n\n3. 充分使用 POST REST
\n\n最后,如果您决定确实想要缓存内容,您的 POST 实际上可以存储转换后的对象(请注意,REST\xe2\x80\x99t 不规定如何存储它,在内存或数据库等中),可以重新存储- 使用 GET 通过 Id 获取。
\n\n选项A
\n\n\n\n\nPOST 到 URI 会创建一个从属资源。
\n
POST http://my.api/data/123\n{add:10, multiply:5}\n
Run Code Online (Sandbox Code Playgroud)\n\n回报
\n\n201 Created\nLocation: http://my.api/data/123/edit/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n然后获取编辑后的数据
\n\nGET http://my.api/data/123/edit/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n选项B
\n\n\n\n\n从 URL 中删除资源标识符,以明确您正在创建一项新项目,而不是更改现有项目。生成的 URL 也与原始 URL 处于同一级别,因为假定它是相同类型的结果。
\n
POST http://my.api/data\n{original: 123, add:10, multiply:5}\n
Run Code Online (Sandbox Code Playgroud)\n\n回报
\n\n201 Created\nLocation: http://my.api/data/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n\n然后获取编辑后的数据
\n\nGET http://my.api/data/{uniqueid}\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
3457 次 |
最近记录: |