覆盖 API 的请求和响应参数以及状态代码的示例 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

覆盖 API 的请求和响应参数以及状态代码的示例

以下示例说明如何创建和测试映射模板覆盖。前两个示例使用 Amazon Web Services Management Console和示例 API 作为起点。最后两个示例使用 Amazon CLI 和适用于 JavaScript 的 SDK。

使用 Amazon Web Services Management Console覆盖 API 的响应状态代码

要使用 PetStore 示例 API 检索宠物,您使用 GET /pets/{petId} 的 API 方法请求,其中 {petId} 是可在运行时获取数字的路径参数。

在此示例中,您将通过创建映射模板(此模板在检测到错误条件时,将 $context.responseOverride.status 映射到 400)来覆盖此 GET 方法的响应代码。

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. API 下,选择 PetStore API,然后选择资源

  3. 资源树中,选择 /{petId} 下的 GET 方法。

  4. 选择测试选项卡。您可能需要选择右箭头按钮,以显示该选项卡。

  5. 对于 petId,输入 -1,然后选择测试

    在结果中,您会发现两件事:

    首先,响应正文指示超出范围错误:

    { "errors": [ { "key": "GetPetRequest.petId", "message": "The value is out of range." } ] }

    其次,日志框下的最后一行的结尾为:Method completed with status: 200

  6. 集成响应选项卡上,对于默认 - 响应,选择编辑

  7. 选择映射模板

  8. 选择添加映射模板

  9. 对于内容类型,输入 application/json

  10. 对于模板正文,输入以下内容:

    #set($inputRoot = $input.path('$')) $input.json("$") #if($inputRoot.toString().contains("error")) #set($context.responseOverride.status = 400) #end
  11. 选择保存

  12. 选择测试选项卡。

  13. 对于 petId,输入 -1

  14. 在结果中,响应正文表示超出范围错误:

    { "errors": [ { "key": "GetPetRequest.petId", "message": "The value is out of range." } ] }

    不过,日志框下的最后一行现在的结尾为:Method completed with status: 400

使用 Amazon Web Services Management Console覆盖 API 的请求参数和标头

在此示例中,您将通过创建映射模板(此模板将 $context.requestOverride.header.header_name 映射到一个组合其他两个标头的新标头)来覆盖 GET 方法的请求标头。

  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. API 下,选择 PetStore API。

  3. 资源树中,选择 /pet 下的 GET 方法。

  4. 方法请求选项卡上,对于方法请求设置,选择编辑

  5. 选择 HTTP 请求标头,然后选择添加标头

  6. 对于名称,请输入 header1

  7. 选择添加标头,然后创建第二个标头,名为 header2

  8. 选择保存

  9. 集成请求选项卡上,对于集成请求设置,选择编辑

  10. 对于请求正文传递,选择当未定义模板时(推荐)

  11. 选择映射模板,然后执行以下操作:

    1. 选择添加映射模板

    2. 对于内容类型,输入 application/json

    3. 对于模板正文,输入以下内容:

      #set($header1Override = "foo") #set($header3Value = "$input.params('header1')$input.params('header2')") $input.json("$") #set($context.requestOverride.header.header3 = $header3Value) #set($context.requestOverride.header.header1 = $header1Override) #set($context.requestOverride.header.multivalueheader=[$header1Override, $header3Value])
  12. 选择保存

  13. 选择测试选项卡。

  14. {pets}标头下,复制以下代码:

    header1:header1Val header2:header2Val
  15. 选择 Test (测试)

    在日志中,您应看到一个包含以下文本的条目:

    Endpoint request headers: {header3=header1Valheader2Val, header2=header2Val, header1=foo, x-amzn-apigateway-api-id=<api-id>, Accept=application/json, multivalueheader=foo,header1Valheader2Val}

使用 Amazon CLI覆盖 API 的请求参数和标头

以下 CLI 示例说明如何使用 put-integration 命令来覆盖响应代码:

aws apigateway put-integration --rest-api-id <API_ID> --resource-id <PATH_TO_RESOURCE_ID> --http-method <METHOD> --type <INTEGRATION_TYPE> --request-templates <REQUEST_TEMPLATE_MAP>

其中,<REQUEST_TEMPLATE_MAP> 是从内容类型到要应用的模板字符串的映射。此映射的结构如下所示:

Content_type1=template_string,Content_type2=template_string

或,在 JSON 语法中:

{"content_type1": "template_string" ...}

以下示例说明如何使用 put-integration-response 命令来覆盖 API 的响应代码:

aws apigateway put-integration-response --rest-api-id <API_ID> --resource-id <PATH_TO_RESOURCE_ID> --http-method <METHOD> --status-code <STATUS_CODE> --response-templates <RESPONSE_TEMPLATE_MAP>

其中,<RESPONSE_TEMPLATE_MAP> 与上述的<REQUEST_TEMPLATE_MAP> 具有相同格式。

使用适用于 JavaScript 的 SDK 覆盖 API 的请求参数和标头

以下示例说明如何使用 put-integration 命令来覆盖响应代码:

请求:

var params = { httpMethod: 'STRING_VALUE', /* required */ resourceId: 'STRING_VALUE', /* required */ restApiId: 'STRING_VALUE', /* required */ type: HTTP | AWS | MOCK | HTTP_PROXY | AWS_PROXY, /* required */ requestTemplates: { '<Content_type>': 'TEMPLATE_STRING', /* '<String>': ... */ }, }; apigateway.putIntegration(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response });

响应:

var params = { httpMethod: 'STRING_VALUE', /* required */ resourceId: 'STRING_VALUE', /* required */ restApiId: 'STRING_VALUE', /* required */ statusCode: 'STRING_VALUE', /* required */ responseTemplates: { '<Content_type>': 'TEMPLATE_STRING', /* '<String>': ... */ }, }; apigateway.putIntegrationResponse(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response });