何时使用(装饰)什么以及为什么 - DefaultErpHttpDestination、DefaultHttpDestination?

When to use (decorate with) what and why - DefaultErpHttpDestination, DefaultHttpDestination?

使用 java SAP Cloud SDK

我必须使用 com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.outbounddeliveryv2.batch.OutboundDeliveryV2ServiceBatch.execute(HttpDestinationProperties destination) 在 S/4 系统上执行一些更新。此方法 execute 采用 HttpDestinationProperties.

类型的参数

因为我需要一个目的地,所以我使用下面的代码来获取目的地:

HttpDestination destination = DestinationAccessor.getDestination("MyErpSystem").asHttp();

由于 HttpDestination 扩展了 HttpDestinationProperties,我们可以安全地将其传递给 execute。但是根据step 4 of 'Connect to OData Service on Cloud Foundry Using SAP Cloud SDK' tutorial,访问目的地的代码是这样的:

ErpHttpDestination destination = DestinationAccessor.getDestination("MyErpSystem").asHttp().decorate(DefaultErpHttpDestination::new);

然后他们将该目的地传递给服务的 execute 方法。

我的问题是,由于 execute 方法采用 HttpDestinationProperties 类型的参数,我怎么知道我必须使用 DefaultErpHttpDestinationDefaultHttpDestination.

也是如此

我有以下问题 -

  1. 何时以及为什么我应该将目的地包装在 DefaultErpHttpDestination 中?
  2. 何时以及为什么我应该将目的地包装在 DefaultHttpDestination 中?
  3. 我为什么要把目的地包装在上面两个包装器中?

这是一个很好的问题!

上下文:

  • 当然你可以继续使用你原来的方法:
    HttpDestination destination =
      DestinationAccessor.getDestination("MyErpSystem").asHttp();
    
    这是 destinations 目标 generic HTTP 服务端点的推荐方式。 它加载 HTTP 连接所需的目标属性,例如URL、身份验证、...

  • 在教程中,我们描述了与 S/4HANA OData 服务的集成:
    HttpDestination destination =
      DestinationAccessor.getDestination("MyErpSystem").asHttp()
        .decorate(DefaultErpHttpDestination::new);
    
    通过 "decorating" 具有 ERP 属性的 HttpDestination 实例,我们启用 additional S/4 相关的 HTTP 请求 headers:sap-clientsap-locale。通过上述配置,这些值会自动从 destination 服务中读取 - 如果它们已设置。

您的问题(顺序改变):

"When and why should I wrap the destination in DefaultHttpDestination?"

DestinationAccessor#getDestination returns 通用 Destination。为了确保我们正在处理 HTTP(而不是 RFC)连​​接,您需要 运行 #asHttp - 正如您已经做的那样。使用生成的 HttpDestination 实例,您可以 运行 HTTP 查询,例如 ODataREST。根据您的用例,不需要额外包装。

例如,如果您要使用 BAPI 端点,那么您需要 运行 #asRfc。此方法将检查不同的 destination 属性以确保设置了所有必需的值。

"When and why should I wrap the destination in DefaultErpHttpDestination?"

建议仅在处理 S/4 服务端点并且依赖 sap-clientsap-locale。包装可以在您的应用程序 运行 时间的任何时间完成,只要它发生在 #execute(HttpDestinationProperties) 方法之前。

如果您不想第二次包装它,那么您需要手动管理 sap-clientsap-locale.[=29= 的 HTTP 请求 headers ]

"Why should I wrap the destination in above two wrappers at all?"

这是API合同。它确保在调用实际请求之前正确设置所有必需的 destination 属性。提供了目标实例的(可选)ERP 风味包装,以确保自动考虑所有 S/4 属性。