Attempt to create simple Contact gives error: PATCH requests require components to be updated

Attempt to create simple Contact gives error: PATCH requests require components to be updated

我目前正在使用 API_MKT_CONTACT 服务定义的 SDK 版本 3.39.0 和版本 0004 使用以下代码在 Marketing Cloud 中创建新联系人:

ContactOriginData contact =
        ContactOriginData.builder()
            .originOfContact(origin)
            .originTimestamp(ZonedDateTime.now())
            .externalContactID(pii.getId().toString())
            .firstName(pii.getFirstName())
            .lastName(pii.getLastName())
            .language(pii.getLanguage())
            .countryReg(pii.getRegion())
            .build();

// use low level API as a work around for https://github.com/SAP/cloud-sdk/issues/156
ODataRequestUpdate contactRequest = service
          .updateContactOriginData(contact)
          .withHeader("Sap-Cuan-RequestTimestamp", getFormattedTime(System.currentTimeMillis()))
          .withHeader("Sap-Cuan-SequenceId", "UpdatePatch")
          .withHeader("Sap-Cuan-SourceSystemType", "EXT")
          .withHeader("Sap-Cuan-SourceSystemId", "sdk-test")
          .toRequest();

String servicePath = "/sap/opu/odata/SAP/API_MKT_CONTACT_SRV;v=0004";
ODataRequestBatch requestBatch =  new ODataRequestBatch(servicePath, ODataProtocol.V2);
requestBatch.beginChangeset().addUpdate(contactRequest).endChangeset();
HttpClient httpClient = HttpClientAccessor.getHttpClient(destination);
ODataRequestResultMultipartGeneric batchResult = requestBatch.execute(httpClient);

运行 这会产生以下错误:

{
  "error": {
    "code": "/IWFND/CM_MGW/096",
    "message": {
      "lang": "en",
      "value": "PATCH requests require components to be updated"
    },
    "innererror": {
      "application": {
        "component_id": "CEC-MKT-DM-IC",
        "service_namespace": "/SAP/",
        "service_id": "API_MKT_CONTACT_SRV",
        "service_version": "0004"
      },
      "transactionid": "3B63A2A6CC920630E0060492A51E7EE7",
      "timestamp": "20210310210334.4378960",
      "Error_Resolution": {
        "SAP_Transaction": "For backend administrators: use ADT feed reader \"SAP Gateway Error Log\" or run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details",
        "SAP_Note": "See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)",
        "Batch_SAP_Note": "See SAP Note 1869434 for details about working with $batch (https://service.sap.com/sap/support/notes/1869434)"
      },
      "errordetails": []
    }
  }
}

但是,如果我在邮递员中执行类似的请求,它可以正常工作:

Request Payload:

--batch
Content-Type: multipart/mixed; boundary=changeset

--changeset
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH ContactOriginData(ContactOrigin='<ContactOrigin>',ContactID='24D8F7F6-440D-44F8-A24B-552435477688') HTTP/1.1
Accept: application/json
Content-Type: application/json
Content-Length: 172
Sap-Cuan-RequestTimestamp: '2021-03-10T14:07:00.000'
Sap-Cuan-SequenceId: UpdatePatch
Sap-Cuan-SourceSystemType: EXT
Sap-Cuan-SourceSystemId: postman-test

{"OriginDataLastChgUTCDateTime":"/Date(1615410479885)/","EmailAddress":"samantha.cook@theoasis.com","FirstName":"Samantha","LastName":"Cook","Country":"US","Language":"EN"}

--changeset--
--batch--

Response Payload:

--1D7E85E6BC66B34E61ACF0EF3964CBD90
Content-Type: multipart/mixed; boundary=1D7E85E6BC66B34E61ACF0EF3964CBD91
Content-Length:       430

--1D7E85E6BC66B34E61ACF0EF3964CBD91
Content-Type: application/http
Content-Length: 262
content-transfer-encoding: binary

HTTP/1.1 204 No Content
Content-Length: 0
dataserviceversion: 2.0
sap-message: {"code":"HPA_STAGING_AREA/037","message":"Payload is processed via staging area. See Import Monitor for details.","target":"","severity":"info","transition":false,"details":[]}


--1D7E85E6BC66B34E61ACF0EF3964CBD91--

--1D7E85E6BC66B34E61ACF0EF3964CBD90--

我应该注意,我也尝试过使用 .replacingEntity(),但它也不起作用并产生完全不同的错误:

Inline component is not defined or not allowed (HTTP PUT)

我是否缺少或未正确使用 SDK 的某些内容? 如有任何帮助,我们将不胜感激!

干杯!

要更新实体,您应该先从服务中获取它。不管你是否使用:

  1. PATCH 将只更新更改的字段
  2. PUT将发送完整的实体对象

目前您正在通过构建器创建一个新的实体对象:ContactOriginData.builder()。相反,请使用服务的相应 getContactOriginDataByKey() 方法首先从服务中检索要更新的实体。实际上,许多服务会强制您这样做,以确保您始终编辑最新版本的数据。这通常通过 ETags which the SDK will also handle for you automatically.

发生

您可以找到有关 update strategies from the SDK on the documentaiton 的更多信息。


编辑: 正如您在评论中指出的那样,实际目标是 创建 一个实体,所讨论的特定服务 仅允许 PUT 和 PATCH 创建对象。

在那种情况下,使用 replacingEntity()(转换为 PUT)应该已经适用于您的代码。您也可以通过将构建器方法替换为构造函数调用 + setter 方法来使 PATCH 工作。