2015-09-21 20 views
1

我怎么可能包括,利用JsonApi,链接到我的REST API方法?比如我有这样的事情:JsonApi方法调用

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

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

回答

2

根据您的更改并基于guillaume31的回答进行更新。

如果它确实是一种更新的资源,那么你应该发出一个补丁: API/V1 /客户/ 1

并配有jsonapi顺应体更新的资源:

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

如果意图是要真正删除资源,那么删除可能更合适。根据您的描述,PATCH可能是最佳路径,因为资源仍然存在,并且可能会根据其他呼叫进行恢复

+0

我更新了我的问题来澄清一点,你认为你的解决方案可以适用于这种情况吗? – HeCtOr

+0

我认为这是使用JsonApi的正确方法 – HeCtOr

0

通过将“停用”作为URI的一部分,您可以使停用资源,这似乎不正确。此IMO不符合REST level 1

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

但是,它可能更忠实于REST,将激活建模为POST或PUT并将其停用为DELETE。您可以从PUT和DELETE的idempotency中受益 - 在连续两次激活或停用客户时,应该使其处于相同状态。但是这也取决于你的域名以及这些行为会带来什么后果。

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

+0

是的,这不是一个RESTFUL的观点。我喜欢使用Post/Put和Delete来激活和停用。 – HeCtOr

1

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介绍的修补程序解决方案也是一种有效的方法,但implementing RESTful PATCH correctly要求变化与操作,数据指针和新的价值描述(也见JSON Patch RFC)。这对于这种简单的情况可能有点矫枉过正。

+0

用于RESTful解决方案。这或多或少是我在回答中提到的。我可能更愿意使用不同的'/ prospect/1','/ customer/1'或'/ customers/inactive/1'资源和关联的POST/DELETE动词来反映不同的状态。 – guillaume31