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)。对于这个简单的场景,这可能有点矫枉过正。
如何使用 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)。对于这个简单的场景,这可能有点矫枉过正。