我很困惑。我理解这两者之间的实际差异,但我看不出这里的实际实现有什么不同。
以下是文档的摘录
更新操作使用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操作与更新完全相同。它使用
PATCH
请求并使用URI来引用特定实体。区别 是,如果实体不存在,它将被创建。如果它已经 存在,它将被更新。通常在创建新实体时 将让系统分配唯一标识符。这是最好的 实践。但是如果你需要创建一个具有特定id值的记录, upsert操作提供了一种方法。这可能很有价值 您正在同步不同系统中的数据的情况。有时您会想要执行upsert, 但是你想要阻止其中一个潜在的默认操作:要么 创建或更新。你可以通过添加来实现这一目标
If-Match
或If-None-Match
标题。有关详细信息,请参阅Limit upsert operations。
所以实际上Basic update
如上所述将是一个upsert
并实现真正的基本更新(如果给定的帐户eixists更新,否则为404)我需要添加If-Match: *
标题到PATCH
请求。
我理解正确吗?
答案 0 :(得分:0)
我在这里和您有相同的理解。在实践中,我发现如果记录不存在,则使用不带If-Match: *
的补丁请求将进行插入。然而令人费解的是,当upsert成功插入记录时,它返回一个404
错误。包含If-Match: *
时,更新失败时会收到400
错误。