函数导入调用中的sap-message标头

问题描述

我们正在使用云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为您提供的类型安全。