【问题标题】:JsonApi method callsJsonApi 方法调用
【发布时间】:2015-12-18 09:38:46
【问题描述】:

如何使用 JsonApi 在我的 Rest API 中包含指向方法的链接?例如,我有这样的内容:

POST api/v1/customer/1/deactivate
POST api/v1/customer/1/activate

相应地激活和停用客户。它们应该如何包含(或不包含)在我的数据对象中? specification 不包括数据对象的“方法”部分。

【问题讨论】:

    标签: rest domain-driven-design json-api


    【解决方案1】:

    根据您的更改和 guillaume31 的回答进行更新。

    如果它确实是对资源的更新,那么您应该发出 PATCH 到: api/v1/customer/1

    并使用符合 jsonapi 的主体来更新资源:

    {
      "data": {
        "type": "customer",
        "id": "1",
        "attributes": {
            "status": "deactivated"
        }
      }
    }
    

    如果目的是真正删除资源,那么删除可能更合适。根据您的描述,PATCH 可能是最佳路径,因为资源仍然存在并且可以根据其他调用恢复

    【讨论】:

    • 我更新了我的问题以进一步澄清,您认为您的解决方案可以适用于这种情况吗?
    • 我认为这是使用 JsonApi 的正确方法
    【解决方案2】:

    POST api/v1/customer/1/deactivate

    POST api/v1/customer/1/activate

    这不是 RESTful。但是客户的“活跃”状态可以看作是一种资源!所以最简单的解决方案如下:

    PUT api/v1/customer/1/active      # Activates customer 1
    DELETE api/v1/customer/1/active    # Deactivates customer 1
    

    @guillaume31 描述的 PATCH 解决方案也是一种有效的方法,但implementing RESTful PATCH correctly 要求用操作、数据指针和新值来描述 change(另请参阅JSON Patch RFC)。对于这个简单的场景来说,这可能有点过头了。

    【讨论】:

    • +1 用于 RESTful 解决方案。这或多或少是我在回答中所指的。不过,我可能更愿意使用不同的 /prospect/1/customer/1/customers/inactive/1 资源和相关的 POST/DELETE 动词来反映不同的状态。
    【解决方案3】:

    通过将“deactivate”作为 URI 的一部分包含在内,您是在对资源进行 deactivate,这似乎是不正确的。此 IMO 不符合 REST level 1 标准。

    据我了解,激活/停用客户相当于更新资源。 JsonApi 建议发送 PATCH 请求来修改资源:http://jsonapi.org/format/#crud-updating

    但是,将激活建模为 POST 或 PUT 并将停用建模为 DELETE 可能更忠实于 REST。您将从 PUT 和 DELETE 的idempotency 中受益——连续两次激活或停用客户可能会使它保持相同的状态。但这也取决于您的域以及这些操作的后果。

    在我知道的 REST 框架中,动词不包含在开箱即用的链接中。 JSON API either 似乎不是这样。

    【讨论】:

    • 是的,这不是 RESTFUL 的观点。我喜欢使用 Post/Put 和 Delete 来激活和停用的想法。
    猜你喜欢
    • 2017-02-06
    • 2020-06-06
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多