Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理更新细节记录的RESTful方法_C#_Rest_Asp.net Web Api_Rpc - Fatal编程技术网

C# 处理更新细节记录的RESTful方法

C# 处理更新细节记录的RESTful方法,c#,rest,asp.net-web-api,rpc,C#,Rest,Asp.net Web Api,Rpc,如果我需要更新许多详细信息行,我的Web API控制器方法可能如下所示,使用RPC样式: [Route("api/updateAccountDetailStatus")] [HttpGet] public IHttpActionResult UpdateAccountDetailStatus(int accountId, string status) 这会将与该帐户关联的所有详细信息行更改为新状态 在尝试采取一种宁静的方式时,我猜想会是这样的: PATCH /accounts/110 {

如果我需要更新许多详细信息行,我的Web API控制器方法可能如下所示,使用RPC样式:

[Route("api/updateAccountDetailStatus")]
[HttpGet]
public IHttpActionResult UpdateAccountDetailStatus(int accountId, string status)
这会将与该帐户关联的所有详细信息行更改为新状态

在尝试采取一种宁静的方式时,我猜想会是这样的:

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

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

我不喜欢的是,现在API控制器方法需要询问对象,看看如何处理它。在这种情况下,它会将所有细节行更改为该新状态。但如果有人调用该修补程序并发送另一个属性进行修改,该怎么办?现在我必须基于此改变行为?有更好的办法吗?

我明白了这个难题。一方面,您希望保持真实,并且在URI中没有操作名称(更改、更新等),另一方面,这是一个特殊的过程,实际上并不是一个补丁

为此,我做了一些工作,允许根据发送的消息类型定义操作,甚至在WebAPI中创建了这样做的方法

此示例代码如下所示

本质上,您可以将它们公开为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"}

对不起,您能解释一下您所说的
interrogate object
的意思吗?如果有人调用该修补程序并发送不同的属性进行修改
?你是说需要有一笔交易吗?当然。如果调用方正在更改状态,那么API方法需要调用某个逻辑方法来更新数据库中的所有详细记录。现在,如果调用方更新另一个属性而不是状态,该怎么办?也许现在我们只需要更新一个属性?或者这意味着我们需要完全启动另一项行动?因此,API方法需要知道更改了哪个属性,以便能够执行适当的操作。这有帮助吗?我明白了,你说的是这不是真正的补丁,我同意,这是一个特殊的动作,需要它自己的动词,就像它一样。我有点困惑。你能提供一个基于我的场景的示例调用吗?一个选项可以是这样的:
/accounts/{accountId}/detailBatchStateChanges
。该方法将知道使用状态更新所有细节记录(状态也必须以某种方式传递)。但现在我可能从“适当的”REST中得到了一种方法,这可能表明REST在这种情况下不起作用。我相信是的,我的意思是休息可以解决这个问题。其中一个原则是自我描述的消息,因此我们应该能够知道如何使用不同的消息来处理相同的资源。感谢更新。因此,您的方法将意味着API方法必须询问对象,以了解要采取的操作类型,对吗?然而,如果我这样做:
/accounts/{accountId}/detailBatchStateChanges
,那么该方法将知道在不检查传入对象的情况下该做什么,对吗?为什么前者更好?您不必这样做,我的示例显示了它如何根据内容类型中传递的信息(它是一个扩展参数)找到对象的类型并找到正确的操作。我接受了你的回答,因为这似乎是真正的休息方式。不过,我将采用更具RPC风格的方法。:)谢谢你的想法。