Dynamics365 web api update vs upsert

时间:2018-02-08 11:04:19

标签: dynamics-crm microsoft-dynamics-webapi

我很困惑。我理解这两者之间的实际差异,但我看不出这里的实际实现有什么不同。

以下是文档的摘录

Basic update

  

更新操作使用HTTP PATCH动词。传递JSON对象   包含要更新到URI的属性   代表实体。状态为204的响应将是   如果更新成功,则返回。

     

此示例使用accountid更新现有帐户记录   值00000000-0000-0000-0000-000000000001。

PATCH [Organization URI]/api/data/v9.0/accounts(00000000-0000-0000-0000-000000000001) HTTP/1.1  
Content-Type: application/json  
OData-MaxVersion: 4.0  
OData-Version: 4.0  

{  
    "name": "Updated Sample Account ",  
    "creditonhold": true,  
    "address1_latitude": 47.639583,  
    "description": "This is the updated description of the sample account",  
    "revenue": 6000000,  
    "accountcategorycode": 2  
}

Upsert

  

upsert操作与更新完全相同。它使用PATCH   请求并使用URI来引用特定实体。区别   是,如果实体不存在,它将被创建。如果它已经   存在,它将被更新。通常在创建新实体时   将让系统分配唯一标识符。这是最好的   实践。但是如果你需要创建一个具有特定id值的记录,   upsert操作提供了一种方法。这可能很有价值   您正在同步不同系统中的数据的情况。

     

有时您会想要执行upsert,   但是你想要阻止其中一个潜在的默认操作:要么   创建或更新。你可以通过添加来实现这一目标   If-MatchIf-None-Match标题。有关详细信息,请参阅Limit upsert operations

所以实际上Basic update如上所述将是一个upsert并实现真正的基本更新(如果给定的帐户eixists更新,否则为404)我需要添加If-Match: *标题到PATCH请求。

我理解正确吗?

1 个答案:

答案 0 :(得分:0)

我在这里和您有相同的理解。在实践中,我发现如果记录不存在,则使用不带If-Match: *的补丁请求将进行插入。然而令人费解的是,当upsert成功插入记录时,它返回一个404错误。包含If-Match: *时,更新失败时会收到400错误。