笔者之前的文章 深受喜爱的 SAP ALV,没有办法在 ABAP Cloud 环境使用了吗 曾经提到,ABAP On-Premise 环境上广泛使用的 SAP ALV,到了 SAP BTP 的 ABAP Cloud 环境上就无法使用了。
ABAP On-Premise 里的 CL_HTTP_CLIENT, 是实际 SAP 项目实施中另一个使用广泛的工具类。能够很方便地通过 HTTP 协议与其他 SAP 系统或者第三方系统进行交互。
比如将一个远端服务地址通过名叫 url 的输入参数,传递给该工具类的 create_by_url 方法,就能向远端地址发起 GET 或 POST 请求。
也可以不在应用程序中将远端地址硬编码,而是在事务码 SM59 里创建一个 Destination,再将远端地址维护到 Destination 里。
然后在代码中,将 Destination 名称,传递到 create_by_destination 方法中。
这种做法将远端交互地址的配置,和应用程序的实现相分离,实现了配置和代码的解耦。
由于和 ALV 同样的原因,CL_HTTP_CLIENT 到了 ABAP Cloud 环境下也无法继续使用,会遇到 Use of XXX is not permitted 的语法错误。
因为 CL_HTTP_CLIENT 的工具类,并不在 ABAP Cloud 环境下 SAP Released Objects 的白名单内。
那么在 SAP BTP ABAP Cloud 环境上,如果确实需要实现通过 HTTP 同第三方服务交互,该怎么去做呢?
我们可以采取和在 ABAP On-Premise 里,使用 SM59 创建 Destination 类似的思路。
在 SAP BTP 控制台的 Connectivity -> Destinations 控制台下面,新建一个 Destination:
选中 SAP BTP 上的 ABAP 实例,单击菜单项 View Dashboard,打开该 ABAP 实例的 Fiori Launchpad:
创建一个新的 Communication Arrangement:
SAP Cloud 环境下的系统集成实现,基于 Communication Arrangement, Scenario 和 System 这三个彼此关联的概念。
Communication Arrangement 是某个特定的 Communication Scenario(集成场景)的运行时描述,负责定义参与集成的业务系统,以及采取怎样的方式进行集成。
系统集成管理员需要创建 Communication System 和 User,分配给 Communication Arrangement,并定义通信时的身份验证方法。
关于 Communication Arrangement 的更多介绍,请参阅 SAP 官方帮助文档。
新建 Communication Arrangement 时需要为其分配 Communication Scenario,选择 SAP_COM_0276,这是 SAP 预制的 SAP BTP Cloud Foundry Destination Service Integration 专用 Scenario.
然后导入 SAP BTP ABAP 环境的 Service Key.
之前的文章 深受喜爱的 SAP ALV,没有办法在 ABAP Cloud 环境使用了吗 笔者已经介绍过如何将这个 Key 下载到本地。
单击 Key 超链接,将 Service Key 下载到本地。
然后用记事本打开,将源代码粘贴到上图的 Service Key Text Area 控件,即可完成 Communication Arrangement 所需的身份认证。
给 Communication Arrangement 设置 Service Instance Name 属性, 这个名称在稍后的 ABAP Cloud 代码中会使用到:jerry-service-instance.
完成 Communication Arrangement 设置之后,动手编写 ABAP Cloud 代码。
代码如下:
TRY.
DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination(
i_name = ‘ZJERRY_API’
i_service_instance_name = ‘jerry-service-instance’
i_authn_mode = if_a4c_cp_service=>service_specific ).
DATA(lo_http_client) = cl_web_http_client_manager=>create_by_http_destination(
i_destination = lo_destination ).
DATA(lo_request) = lo_http_client->get_http_request( ).
DATA(lo_response) = lo_http_client->execute( i_method = if_web_http_client=>get ).
out->write( lo_response->get_text( ) ).
CATCH cx_root INTO DATA(lx_exception).
out->write( lx_exception->get_text( ) ).
ENDTRY.
将 SAP BTP 控制台创建的 Destination 名称,以及上述步骤在 Communication Arrangement 里创建的 Service Instance 名称,分别传递到 cl_http_destination_provider 的 create_by_cloud_destination 的两个输入参数即可。
最后在 ABAP Development Tool 里执行这个 ABAP 类,能看到其通过 SAP BTP 上的 Destination 和 Communication Arrangment,成功从 Bing 网站读取回的首页 HTML 源代码。
除了本文使用的 SAP_COM_0276 这个 Communication Scenario 之外,关于 SAP 发布的其他能够在 SAP BTP ABAP 环境下使用的 Communication Scenario 的详细信息,可以参阅 SAP 官网:
https://github.com/SAP-docs/btp-cloud-platform/blob/main/docs/50-administration-and-ops/overview-of-communication-scenarios-managed-by-sap-2d16f49.md