问题描述
我目前使用 SDK 版本 3.39.0
和 0004
服务定义的 API_MKT_CONTACT
版本尝试使用以下代码在 Marketing Cloud 中创建具有 AdditionalID 的新联系人:>
ODataRequestUpdate contactRequest =
contactService
.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();
var additionalId =
AdditionalID.builder()
.externalContactID(pii.getId().toString())
.originofContact(origin)
.originofContact_2("EMAIL") //ContactAdditionalOrigin
.externalContactID_2(pii.getEmail()) //ContactAdditionalID
.build();
var additionalIdRequest = contactService
.updateAdditionalIDs(additionalId)
.replacingEntity()
.withHeader("Sap-cuan-RequestTimestamp",getFormattedTime(System.currentTimeMillis()))
.withHeader("Sap-cuan-SourceSystemType","EXT")
.withHeader("Sap-cuan-SourceSystemId","sdk-test")
.toRequest();
// use low level API as a work around for https://github.com/SAP/cloud-sdk/issues/156
ODataRequestBatch requestBatch = new ODataRequestBatch(ContactService.DEFAULT_SERVICE_PATH,ODataProtocol.V2);
requestBatch
.beginChangeset()
.addUpdate(contactRequest)
.addUpdate(additionalIdRequest)
.endChangeset();
HttpClient httpClient = HttpClientAccessor.getHttpClient(contactsDestination);
ODataRequestResultMultipartGeneric batchResult = requestBatch.execute(httpClient);
batchResult.getResult(additionalIdRequest);
这会导致以下错误:
{
"error": {
"code": "SY/530","message": {
"lang": "en","value": "Inline component is not defined or not allowed (HTTP PUT)"
},"innererror": {
"application": {
"component_id": "CEC-MKT-DM-IC","service_namespace": "/SAP/","service_id": "API_MKT_CONTACT_SRV","service_version": "0004"
},"transactionid": "3B63A2A6CC9205E0E00604E1D31F1CDF","timestamp": "20210315142401.8432680","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": []
}
}
}
我使用 this documentation 作为构建请求的指南(在“创建具有其他 ID 的联系人”部分下)。当我在 Postman 中运行示例代码时,它按预期工作。请注意,AdditionalID 的负载是一个空的 JSON 对象。
所以我启用了 HTTP 线路日志并注意到 SDK 似乎包含以下有效负载:
PUT AdditionalIDs(ContactAdditionalOrigin='EMAIL',ContactAdditionalID='wade.watts@theoasis.com',ContactID='ae46e174-52a3-4de6-8caa-57213151b295',ContactOrigin='<CONTACT_ORIGIN>') HTTP/1.1
Sap-cuan-SourceSystemId: sdk-test
Accept: application/json
Sap-cuan-SourceSystemType: EXT
Content-Type: application/json
Sap-cuan-RequestTimestamp: '2021-03-15T14:24:00.828'
{"ContactOrigin":"<CONTACT_ORIGIN>","ContactID":"ae46e174-52a3-4de6-8caa-57213151b295","ContactAdditionalOrigin":"EMAIL","ContactAdditionalID":"wade.watts@theoasis.com","ContactAdditionalIdUUID":null,"ContactUUID":null,"ContactAddlIdisInvalid":null,"MarketingAreas":[]}
不幸的是,我似乎找不到在使用 SDK 时省略有效负载/内联组件以使其与示例代码匹配的方法。这是 SDK 的问题还是我做错了什么?任何帮助将不胜感激!
干杯!
更新
应用来自@matkuhr 的建议解决方法,我将上面的 additionalIdRequest
更改为这样,并且有效:
ODataEntityKey key = new ODataEntityKey(ODataProtocol.V2)
.addKeyProperty(AdditionalID.EXTERNAL_CONTACT_ID.getFieldName(),mcContact.getContactId())
.addKeyProperty(AdditionalID.ORIGIN_OF_CONTACT.getFieldName(),origin)
.addKeyProperty(AdditionalID.ORIGIN_OF_CONTACT_2.getFieldName(),"EMAIL")
.addKeyProperty(AdditionalID.EXTERNAL_CONTACT_I_D_2.getFieldName(),mcContact.getEmailAddress());
var request = new ODataRequestUpdate(
ContactService.DEFAULT_SERVICE_PATH,"AdditionalIDs",key,"{}",UpdateStrategy.REPLACE_WITH_PUT,null,ODataProtocol.V2);
request.addHeader("Sap-cuan-RequestTimestamp",getFormattedTime(System.currentTimeMillis()));
request.addHeader("Sap-cuan-SourceSystemType","EXT");
request.addHeader("Sap-cuan-SourceSystemId","sdk-test);
解决方法
不是你做错了什么,也不是SDK,而是服务。该服务似乎大大偏离了 OData V2 约定以及基本的 HTTP 约定。
您可以通过更多地利用 SDK 的低级 API 来解决此问题。使用服务所需的有效负载完全手动创建更新请求,例如:
ODataEntityKey key = new ODataEntityKey(ODataProtocol.V2)
.addKeyProperty(Contact.XYZ.getFieldName(),contact.getXyz())
request = new ODataRequestUpdate(
contactService.getServicePath(),contact.getEntityCollection(),key,"{ }",// this will be the payload
UpdateStrategy.REPLACE_WITH_PUT,null,ODataProtocol.V2);
request.addHeader("key","val");
// add more headers & parameters if needed and execute