JsonApi 方法调用

JsonApi method calls

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

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

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

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

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

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

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

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

通过将 "deactivate" 作为 URI 的一部分,您相当于停用了资源,这似乎是不正确的。此 IMO 不 REST level 1 合规。

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

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

在我所知道的 REST 框架中,开箱即用的链接中不包含动词。 JSON API either.

我好像不是这样

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 requires that the change is described with operation, data pointer and new value (see also the JSON Patch RFC)。对于这个简单的场景,这可能有点矫枉过正。