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

标签 web-services rest restful-architecture

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

考虑一些可以使用 GET 检索的数值数据。称呼:

GET http://my.api/data/123/

用户可以应用一系列算术运算,例如 addmultiply .一种非 RESTful 方法是:
GET http://my.api/data/123?add=10&multiply=5

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

  • 我目前正在考虑两种 RESTful 方式:

    1. 将算术运算建模为数据的子资源。

    如果我们考虑 addmultiply作为数据的子资源 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 的子资源

    优点:
  • 无状态:服务器不保留任何有关修改数据的信息。
  • 轻松访问修改后的数据:这只是一个简单的 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 次电话。

  • 是否有更简洁、更语义化的方式来实现 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/

    相关文章:

    node.js - 用于生成 pdf 的 React JS/Node JS/Java RESTful API

    java - 如何确认推送网络服务

    c++ - 在 Visual Studio 2019 中添加服务引用

    web-services - REST - 删除对象集合

    java - UI-Test 和 Rest 有什么区别?

    security - Elasticsearch 安全措施?

    java - 无法在 GlassFish 中使用 Jersey 启用 REST(引发与 JPA 相关的异常)

    java - 获取 java.lang.NoSuchFieldError : VALUE in RamlValidationService

    asp.net - Azure API应用程序与移动应用程序与Web应用程序