

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

# 适用于 SAP ABAP 的 AWS SDK features
<a name="features"></a>

适用于 SAP ABAP 的 AWS SDK 提供以下功能。

**Topics**
+ [编程配置](#programmatic-configuration)
+ [Waiter](#waiters)
+ [分页器](#paginators)
+ [重试行为](#retry-behavior)
+ [预签名者](#presigners)
+ [跨账户 IAM 角色链](#source-profile)

## 编程配置
<a name="programmatic-configuration"></a>

使用适用于 SAP ABAP 的 AWS SDK 的 `/n/AWS1/IMG` IMG 交易，使用适用于 SAP ABAP 的 AWS SDK 的自定义业务配置应用程序——BTP 版本进行编程配置。

如需开始进行编程配置，请先使用 `get_config( )` 命令检索配置对象。

```
data(lo_config) = lo_s3->get_config( ).
```

所有配置对象均使用 `/AWS1/IF_RT_CONFIG` 接口，其中包括与 `IMG` 对应的 `GET`ter 和 `SET`ter。例如，您可以覆盖默认区域。请参阅以下示例命令。

```
lo_s3->get_config( )->/aws1/if_rt_config~set_region( 'us-east-1' ).
```

有些配置对象（如最大重试次数）没有 `IMG` 表示，只能以编程方式进行设置。请参阅以下示例命令。

```
lo_s3->get_config( )->/aws1/if_rt_config~set_max_attempts( 10 ).
```

的配置对象 AWS 服务 还可以包括中未表示的特定于服务的方法`/aws1/if_rt_config`。例如，Amazon S3 可以使用 `foobucket.s3.region.amazonaws.com` 虚拟端点或 `s3.region.amazonaws.com/foobucket` 路径样式，对 `foobucket` 存储桶进行寻址。您可以使用以下示例命令，强制使用路径样式。

```
lo_s3->get_config( )->set_forcepathstyle( abap_true ).
```

有关服务配置的更多信息，请参阅 [适用于 SAP ABAP 的 AWS SDK — API 参考指南](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)。

## Waiter
<a name="waiters"></a>

使用异步操作时 AWS APIs，您需要等待特定资源可用后再采取进一步的操作。例如，的 `CREATETABLE()` API Amazon DynamoDB 会立即使用表格状态进行响应`CREATING`。只有当表状态更改为 `ACTIVE` 后，才能启动读取或写入操作。服务员使您能够在对 AWS 资源执行操作之前确认资源是否处于特定状态。

服务员使用服务操作来轮询 AWS 资源的状态，直到资源达到预期状态或确定资源未达到所需状态。通过编写代码来持续轮询 AWS 资源的操作可能既耗时又容易出错。Waiter 负责代表您执行轮询，有助于简化流程。

查看以下使用 Waiter 的 Amazon S3 示例。

```
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).
 
" Create a bucket - initiates the process of creating an S3 bucket and might return before the bucket exists
lo_s3→createbucket( iv_bucket = |amzn-s3-demo-bucket| ).
 
" Wait until the newly created bucket becomes available
lo_s3->get_waiter( )->bucketexists(
    iv_max_wait_time = 200
    iv_bucket = |amzn-s3-demo-bucket|
).
```
+ 本示例使用 Amazon S3 客户端创建存储桶。执行 `get_waiter()` 命令以指定 `bucketexists` 的时机。
+ 请务必为每个 Waiter 指定 `iv_max_wait_time` 参数。此参数表示 Waiter 在完成指定操作前的等待总时长。在上述示例中，Waiter 可运行 200 秒。
+ 必填参数中需要输入其他信息。在上述示例中，必须为 `iv_bucket` 参数输入 Amazon S3 存储桶名称。
+ `/AWS1/CX_RT_WAITER_FAILURE` 异常表示 Waiter 的等待时长已超出 `iv_max_wait_time` 参数指定的最大时长。
+ `/AWS1/CX_RT_WAITER_TIMEOUT` 异常表示 Waiter 因未达到所需状态而停止运行。

## 分页器
<a name="paginators"></a>

有些 AWS 服务 操作会提供分页响应。分页后，这些操作会在每次响应时返回固定数量的数据。您需要使用令牌或标记发送后续请求，才能检索整组结果。例如，Amazon S3 `ListObjectsV2` 操作每次最多只能返回 1000 个对象。您必须使用相应令牌发送后续请求，才能获得下一页的结果。

分页流程会连续发送请求，以从上次请求中断的地方继续操作。分页器是一种结果型迭代器，由适用于 SAP ABAP 的 SDK 提供。你可以轻松使用分页，而不必了解 APIs 使用分页令牌的 API 的底层机制。

**分页器应用**

您可以使用会返回分页器对象的 `get_paginator()` 方法创建分页器。分页器对象会调用正在进行的分页操作。分页器对象会接受需要提供给底层 API 的参数。分页流程会返回迭代器对象，可使用 `has_next()` 和 `get_next()` 方法迭代分页结果。
+ `has_next()` 会返回布尔值，指示调用操作是否还有更多可用响应或页面。
+ `get_next()` 会返回操作响应。

以下示例列出了使用分页器检索到的 S3 存储桶中的所有对象。

```
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( 'DEMO' ).
DATA(lo_s3) = /aws1/cl_s3_factory=>create( lo_session ).

TRY.
    DATA(lo_paginator) = lo_s3->get_paginator( ).
    DATA(lo_iterator) = lo_paginator->listobjectsv2(  
        iv_bucket = 'example_bucket'
    ).
    WHILE lo_iterator->has_next( ). 
        DATA(lo_output) = lo_iterator->get_next( ).
        LOOP AT lo_output->get_contents(  ) INTO DATA(lo_object).
            WRITE: / lo_object->get_key( ), lo_object->get_size( ).
        ENDLOOP.
    ENDWHILE.
CATCH /aws1/cx_rt_generic INTO DATA(lo_ex).
    MESSAGE lo_ex->if_message~get_text(  ) TYPE 'I'.
ENDTRY.
```

## 重试行为
<a name="retry-behavior"></a>

利用适用于 SAP ABAP 的 SDK，您可以为针对 AWS 服务 发出的由于节流或暂时错误而失败的请求配置最大重试次数。服务客户端级别允许的重试次数（即 SDK 在失败并引发异常之前重试操作的次数）由服务配置对象中的 `AV_MAX_ATTEMPTS` 属性指定。创建服务客户端对象时，SDK 会将 `AV_MAX_ATTEMPTS` 属性配置为默认值 3。服务配置对象可用于以编程方式将最大重试尝试次数设置为所需值。有关更多详细信息，请参阅以下示例。

```
" Retrieve configuration object using Amazon S3 service’s get_config( ) method
DATA(lo_config) = lo_s3->get_config( ).

" Set the maximum number of retries to 5
lo_config->/aws1/if_rt_config~set_max_attempts( 5 ).
 
" Get the value of the maximum retry attempt.
DATA(lv_max_retry_attempts) = lo_config->/aws1/if_rt_config~get_max_attempts( ).
```

**注意**  
尽管配置对象 ABAP SDK 允许使用 `/AWS1/IF_RT_CONFIG~SET_RETRY_MODE()` 方法设置*重试模式*，但 SDK 仅支持 `standard` 重试模式。有关更多信息，请参阅《工具参考指南》中的 “[AWS SDKs 重试行为](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html)”。

## 预签名者
<a name="presigners"></a>

您可以使用预签名 URLs 向某些人授予限时访问权限。 AWS 服务可以在浏览器中输入预签名 URL，也可以由程序使用预签名 URL 来执行服务操作。在到期日期和时间之前，可以多次使用预签名 URL。有关更多信息，请参阅[使用适用于 SAP 的预签名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html) S URLs DK。对于支持预签名者的服务，ABAP 客户端将使用一种特殊的方法`GET_PRESIGNER()`来为该服务创建预签名者。然后调用 presigner 的方法，该方法与 API 客户端的方法相对应，只是它们返回预签名 URL 而不是实际执行操作。

```
" Retrieve a presigner for Amazon S3
DATA(lo_presigner) = lo_s3->get_presigner( iv_expires_sec = 600 ).

" the presigner getobject() method has the same signature as
" lo_s3->getobject(), but it doesn't actually make the call.
" to the service.  It just prepares a presigned URL for a future call
DATA(lo_presigned_req) = lo_presigner->getobject( iv_bucket = iv_bucket_name iv_key = iv_key ).

" You can provide this URL to a web page, user, email etc so they
" can retrieve the file.  The URL will expire in 10 minutes.
ov_url = lo_presigned_req->get_url( ).
```

## 跨账户 IAM 角色链
<a name="source-profile"></a>

跨账户 IAM 角色链支持允许通过源配置文件配置跨多个 AWS 账户无缝访问资源。此功能允许您配置多个角色假设，其中一个配置文件扮演一个角色，然后扮演另一个角色，从而启用复杂的跨账户访问模式。

有关更多信息，请参阅[使用来源配置文件进行跨账户访问](https://docs.aws.amazon.com/sdk-for-sapabap/latest/developer-guide/source-profile.html)。