问题描述
我们正在使用云sdk(java)向s4系统触发草案激活调用(提交调用)。 odata v2.0中的S4 odata服务。提交调用是函数导入 具有以下签名-
<FunctionImport
Name="C_GuidedProcmtReqnHdrTPActivation"
ReturnType="MmpuR_REQ_GPR_MAINTAIN_SRV.C_GuidedProcmtReqnHdrTPType"
EntitySet="C_GuidedProcmtReqnHdrTP" m:HttpMethod="POST"
sap:action-for="MmpuR_REQ_GPR_MAINTAIN_SRV.C_GuidedProcmtReqnHdrTPType"
sap:applicable-path="Activation_ac">
<Parameter Name="PurchaseRequisition" Type="Edm.String"
Mode="In" MaxLength="10" />
<Parameter Name="DraftUUID" Type="Edm.Guid" Mode="In" />
<Parameter Name="IsActiveEntity" Type="Edm.Boolean"
Mode="In" />
</FunctionImport>
使用vdm,我们正在执行以下调用
HeaderCDSForPRForGuidedBuying requisitionHeader = s4ReqService
.guidedProcmtReqnHdrTPActivation(Constants.EMPTY_STRING,UUID.fromString(draftReqId.toString()),false)
.cachingMetadata().execute(getS4Destination());
但是,我们无法在此调用中接收sap-message标头。问题是如何领取 该函数导入的SAP消息?
我们正在使用Cloud SDK版本3.21.0
解决方法
更新:
从SAP Cloud SDK 3.34.1开始,我们为OData V2提供了改进的功能导入逻辑。我们提供方法yourFunctionImport.toRequest()
,该方法可以访问内部构建的OData请求对象。
您可以使用此请求对象来调用函数导入,并检索函数导入结果的Java表示,其中包括响应头。
代码段:
final ODataRequestGeneric odataRequest = s4ReqService
.guidedProcmtReqnHdrTPActivation(Constants.EMPTY_STRING,UUID.fromString(draftReqId.toString()),false)
.toRequest();
final ODataRequestResult odataResult =
odataRequest.execute(HttpClientAccessor.getHttpClient(destination));
final Iterable<String> headerNames = odataResult.getHeaderNames();
final Iterable<String> headerValues = odataResult.getHeaderValues("header-key);
过时:
在撰写本文时,无法使用OData VDM访问函数导入调用的HTTP响应标头。如果此功能在较新的版本中可用,我将更新此答案。
目前,我们建议您手动建立请求作为解决方法。
让我为带有GET请求的功能导入草拟一下。
通用模式:
final ODataRequestRead functionImportRequest = new ODataRequestRead("service-url","function-import-name","query-string",ODataProtocol.V2);
final ODataRequestResultGeneric functionImportResponse = functionImportCall.execute(HttpClientAccessor.getHttpClient(destination));
final Iterable<String> headerNames = functionImportResponse.getHeaderNames();
final Iterable<String> headerValues = functionImportResponse.getHeaderValues("response-header-key");
将该通用模式应用于具体服务的具体功能导入:
final ODataRequestRead functionImportRequest = new ODataRequestRead("/sap/opu/odata/sap/API_CV_ATTACHMENT_SRV/","GetAttachmentCount","BusinessObjectTypeName='1000'&LinkedSAPObjectKey='2000'&SemanticObject='3000'",ODataProtocol.V2);
final ODataRequestResultGeneric functionImportResponse = functionImportCall.execute(HttpClientAccessor.getHttpClient(destination));
//use functionImportResponse.getHeaderNames() or functionImportResponse.getHeaderValues(key)
如果函数导入需要POST请求,则必须添加其他CSRF令牌处理。
此替代方法的缺点是忽略了VDM为您提供的类型安全。