4

我很困惑。我了解这两者之间的实际区别,但我在这里看不到实际实现的任何区别。

这是文档的摘录

基本更新

更新操作使用 HTTPPATCH动词。将包含要更新的属性的 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-MatchIf-None-Match标题来完成此操作。有关详细信息,请参阅限制 upsert 操作

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

我理解正确吗?

4

1 回答 1

1

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

于 2018-06-26T12:45:07.433 回答