RESTful 处理更新详细记录的方法
RESTful Way to Handle Updating Detail Records
如果我需要更新许多详细信息行,我的 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 控制器方法需要询问对象以查看如何处理它。在这种情况下,它会将所有详细信息行更改为该新状态。但是,如果有人调用该补丁并发送不同的 属性 进行修改怎么办?现在我必须根据那个改变行为?有没有更好的方法?
我看到了这个难题。一方面,您希望保持真实并且在您的 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]
这是迄今为止我对这些类型的资源唯一的解决方案。
更新
在 api/accounts/id
发送表示消息类型的有效负载时,您必须将其公开为 PUT(因为我认为它是幂等的):
PUT api/accounts/id
{"detailBatchStateChange": "hold"}
如果我需要更新许多详细信息行,我的 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 控制器方法需要询问对象以查看如何处理它。在这种情况下,它会将所有详细信息行更改为该新状态。但是,如果有人调用该补丁并发送不同的 属性 进行修改怎么办?现在我必须根据那个改变行为?有没有更好的方法?
我看到了这个难题。一方面,您希望保持真实并且在您的 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]
这是迄今为止我对这些类型的资源唯一的解决方案。
更新
在 api/accounts/id
发送表示消息类型的有效负载时,您必须将其公开为 PUT(因为我认为它是幂等的):
PUT api/accounts/id
{"detailBatchStateChange": "hold"}