RESTful方式处理更新细节记录

时间:2018-05-08 14:09:51

标签: c# rest asp.net-web-api rpc

如果我需要更新许多详细信息行,我的Web API控制器方法可能看起来像这样,使用RPC样式:

[Route("api/updateAccountDetailStatus")]
[HttpGet]
public IHttpActionResult UpdateAccountDetailStatus(int accountId, string status)

这会将与该帐户关联的所有详细信息行更改为新状态。

在尝试采用RESTful方法时,我的猜测是它会是这样的:

PATCH /accounts/110
{
  "status": "hold"
}

[Route("api/accounts/id")]
[HttpGet]
public IHttpActionResult Account(Account account)

我不喜欢的是现在API控制器方法需要询问对象以查看如何处理它。在这种情况下,它会将所有细节行更改为新状态。但是,如果有人调用该补丁并发送不同的属性进行修改呢?现在我必须根据这个改变行为?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我看到了这个难题。一方面,您希望保持真实,并且在URI中没有动作名称(更改,更新等),另一方面,这是一个特殊的过程,而不是真正的PATCH。

因此,对于这个article,我做了一些工作,允许通过发送的消息类型定义操作,甚至创建了在Web API中执行此操作的方法。

此示例代码为here

基本上,您将这些暴露为POST或PUT(取决于它们是否是幂等的),并且资源将对其进行多次POST或PUT。例如:

GET /api/InventoryItem [gets all items]
GET /api/InventoryItem/{id} [gets detail of a single item]
POST /api/InventoryItem [creates an item]
POST /api/InventoryItem/{id}* [checks in stock items to the inventory]
POST /api/InventoryItem/{id}* [removes stock items from the inventory]
PUT /api/InventoryItem/{id} [renames an item]
DELETE /api/InventoryItem/{id} [de-activates an item]

这是迄今为止我为这些类型的资源提供的唯一解决方案。

UDPATE

必要的是,你会在api/accounts/id发送一个表示消息类型的有效负载时将其公开为PUT(因为我认为它是幂等的):

PUT api/accounts/id

{"detailBatchStateChange": "hold"}