适用于 SAP ABAP 的 SDK 概念 - Amazon 适用于 SAP 的 SDK ABA
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

适用于 SAP ABAP 的 SDK 概念

本节涵盖的基本概念 适用于 SAP ABAP 的 Amazon SDK。

API 类

每个都分配了一个 Amazon Web Service 由三个字母组成的首字母缩略词或TLA。此服务由 /AWS1/IF_<TLA> 格式的接口表示。我们称之为服务接口。API 类在 /AWS1/API_<TLA> 软件包中。服务接口由每个 Amazon 操作的一个方法组成(我们将这些方法称为操作方法)。要查看 适用于 SAP ABAP 的 Amazon SDK TLA 的完整模块列表,请参阅 适用于 SAP ABAP 的 Amazon SDK -模块列表

每种操作方法有多个 IMPORTING 参数,但最多只有一个 RETURNING 参数。这些参数通常会作为对象,具有复杂的构造函数和一套 GET…() 方法。在许多情况下,对象将包含嵌套对象、递归引用、对象表和表格等。这是因为传递 Amazon Web Services 的是深层的 XML 和 JSON 结构,这些结构不能用一组扁平的参数来表示。

RETURNING参数始终是一个类,即使该类只包含一个属性。

其他对象

每个 API 包中不仅有 API 主类,还有各种相关的存储库和数据字典对象。

  • 每个结构类型对象的类。

  • 表中出现的任意原始数据类型的类。例如,当服务返回字符串表时,ABAP API 会将其作为对象表,其中每个对象都是用来封装字符串的包装程序类。这样,包装程序类就能隐藏关于表示空字符串(无法在 ABAP 中进行本地表示)的详细信息。

  • 适用于服务定义的特定错误的异常类

  • 适用于每种原始数据类型的数据元素。每种数据类型都有数据元素,可自行记录。

  • 适用于内部处理的其他对象,例如对 XML 和 JSON 负载进行序列化和反序列化操作的 XSLT 转换。

结构类

服务发送和接收的大部分 Amazon 数据都由 Amazon SDK 表示为类。这些类代表了数据结构,同时也隐藏了存储内部的详细信息。这些类尤其会隐藏表示此字段没有值的 SDK 方式。

一共有三种方法可应对结构类中的每个字段。

GET_field( )

GET_field( )

  • 返回字段值,或者

  • 如果字段中没有值,则返回默认值,可设为可选参数。

例如,可以考虑以下打印存储桶位置限制的代码。

DATA(lo_location) = go_s3->getbucketlocation( iv_bucket = CONV string( gv_bucket ) ). WRITE: / 'Bucket Location: ',    lo_location->get_locationconstraint( ). 

如果存储桶完全没有位置限制(如 us-east-1),则 GET_LOCATIONCONSTRAINT( ) 将返回空字符串。如果字段中没有值,则可以覆盖此行为并指定所需值。

DATA(lo_location) = go_s3->getbucketlocation( iv_bucket = CONV string( gv_bucket ) ). WRITE: / 'Bucket Location: ',    lo_location->get_locationconstraint( iv_value_if_missing = 'assuming us-east-1' ). 

如果 getbucketlocation() 未在结果中返回位置,则此程序将写入 Bucket Location: assuming us-east-1

如果缺失请求值,请参阅以下代码示例,采用 GET( ) 法返回特定结果。

data(lo_location) = go_s3->GETBUCKETLOCATION( new /AWS1/CL_S3_GET_BUCKET_LOC_REQ( iv_bucket = gv_bucket ) ). write: / 'Location constraint: ', lo_location->GET_LOCATIONCONSTRAINT( 'NopeNopeNope' ).

此时,如果没有位置限制,GET_LOCATIONCONSTRAINT( ) 将返回 NopeNopeNope

HAS_field( )

HAS_field( ) 法用于确定字段中是否存在值。请参阅以下示例。

if NOT lo_location->HAS_LOCATIONCONSTRAINT( ).    write: / 'There is no location constraint'. endif.

如果已知某个字段始终有值,则无需使用 HAS_field( ) 法。

ASK_field( )

如果字段中没有值,则 ASK_field( ) 法会返回值或引发异常。这种方法能够轻松处理大量字段,并在字段不含值时摆脱逻辑,采用其他方法。

TRY.    WRITE: / 'Location constraint: ', lo_location->ask_locationconstraint( ). CATCH /aws1/cx_rt_value_missing.    WRITE: / 'Never mind, there is no location  constraint'. ENDTRY.

请注意,/AWS1/CX_RT_VALUE_MISSING 是静态异常,如果不捕获此异常,就会收到警告。

最佳实践

通常可以采用 GET_field( ) 法,将空字符串作为空白字符串,这也是三个选项中最接近 ABAP 的方法。但这种方法难以分辨字段到底是空白值还是没有值。如需通过区分缺失数据和空白数据来建立业务逻辑,则采用 HAS 法或 ASK 法。

数组

数组用 ABAP 标准对象表进行表示。

JSON 数组中可包含 NULL 值,如以下数组:[‘cat’, ‘dog’, null, ‘horse’]。这是稀疏数组。稀疏数组在 ABAP 中表示为对象引用的内部表,而 null 值在表中表示为 ABAP null 真实值。迭代稀疏表时,必须检查 null 值,以免接触 null 对象或产生 CX_SY_REF_IS_INITIAL 异常。 Amazon 服务中其实很少出现稀疏数组。

使用 ABAP 7.40 新构造可以轻松初始化对象数组。您可以考虑使用分配到的若干安全组启动此 Amazon EC2 实例:

ao_ec2->runinstances(     iv_imageid                   = lo_latest_ami->get_imageid( )     iv_instancetype              = 't2.micro'     iv_maxcount                  = 1     iv_mincount                  = 1     it_securitygroupids          = VALUE /aws1/cl_ec2secgrpidstrlist_w=>tt_securitygroupidstringlist(                                     ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-12345678' ) )                                     ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-55555555' ) )                                     ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-99999999' ) )                                                                                                        )     iv_subnetid                  = ao_snet->get_subnetid( )     it_tagspecifications         = make_tag_spec( 'instance' ) )

映射

JSON 映射在 ABAP 中表示为 Hashed Tables,其中每个表行都只有两个组件。

  • KEY:表中的 UNIQUE KEY 字符串。

  • VALUE:含值对象。

映射是 Amazon SDK 使用真实结构而不是类的极少数案例之一。这是必要的,因为 ABAP 哈希表不能将对象引用作为键字段,而且 Amazon 映射键始终是非空字符串。

更高级别的函数

上一节中API 类描述的精确镜像了 Amazon 服务 API,并将这些 API 表示为熟悉的 ABAP 类。在某些情况下,SDK 还包括更高级别的函数,这些函数在 API 类之上构建,以简化某些操作。为了方便程序员而包含更高级别的函数,并且不会取代较低级别的 API 类。

如果 SDK 包含模块的更高级别的函数,则它们包含在同一个传输中,并且可以通过名为的工厂类进行访问/AWS1/CL_TLA_L2_FACTORY。工厂类包括为模块创建各种更高级别的客户端的方法,这些客户端与 API 文档中的 API 的其余部分一起记录在案。