

# API Gateway 中的简单计算器 API
<a name="simple-calc-lambda-api"></a>

我们的简单计算器 API 公开了三种方法（GET、POST、GET）来调用 [简单的计算器 Lambda 函数](simple-calc-nodejs-lambda-function.md)。此 API 的图形表示如下：

![\[生成的开发工具包的简单计算器 API\]](http://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/images/simple-calc-api-console-hierarchy-new-console.png)


这三种方法显示为后端 Lambda 函数提供输入来执行相同操作的不同方式：
+ `GET /?a=...&b=...&op=...` 方法使用查询参数来指定输入。
+ `POST /` 方法使用 JSON 负载 `{"a":"Number", "b":"Number", "op":"string"}` 来指定输入。
+ `GET /{a}/{b}/{op}` 方法使用路径参数来指定输入。

如果未定义，API Gateway 通过将 HTTP 方法和路径部分组合起来，生成对应的开发工具包方法名称。根路径部分 (`/`) 称为 `Api Root`。例如，API 方法 `GET /?a=...&b=...&op=...` 的默认 Java 开发工具包方法名称为 `getABOp`，`POST /` 的默认开发工具包方法名称为 `postApiRoot`，`GET /{a}/{b}/{op}` 的默认开发工具包方法名称为 `getABOp`。单独的开发工具包可以自定义约定。对于开发工具包特定的方法名称，请参考生成的开发工具包源中的文档。

您可以并且应该通过在各个 API 方法上指定 [operationName](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#operationName) 属性来覆盖默认开发工具包方法名称。您可在使用 API Gateway REST API [创建 API 方法](https://docs.aws.amazon.com/apigateway/latest/api/API_PutMethod.html)或[更新 API 方法](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateMethod.html)时这样做。在 API Swagger 定义中，您可以设置 `operationId` 以实现相同结果。

在演示如何使用 API Gateway 为该 API 生成的开发工具包来调用这些方法之前，我们先简单回想一下如何对其进行设置。有关详细说明，请参阅[开发 API Gateway 中的 REST API](rest-api-develop.md)。如果您是 API Gateway 的新用户，请先参阅[选择 AWS Lambda 集成教程](getting-started-with-lambda-integration.md)。

## 创建用于输入和输出的模型
<a name="simple-calc-lambda-api-create-models-for-input-and-output"></a>

为了在 SDK 中指定强类型输入，我们为该 API 创建了一个 `Input` 模型。为了描述响应正文数据类型，我们创建了一个 `Output` 模型和一个 `Result` 模型。

**创建用于输入、输出和结果的模型**

1. 在主导航窗格中，选择**模型**。

1. 选择**创建模型**。

1. 对于**名称**，请输入 **input**。

1. 对于**内容类型**，输入 **application/json**。

   如果未找到匹配的内容类型，则不执行请求验证。要使用同一模型而不考虑内容类型，请输入 **\$1default**。

1. 对于**模型架构**，输入以下模型：

   ```
   {
       "$schema" : "$schema": "http://json-schema.org/draft-04/schema#",
       "type":"object",
       "properties":{
           "a":{"type":"number"},
           "b":{"type":"number"},
           "op":{"type":"string"}
       },
       "title":"Input"
   }
   ```

1. 选择**创建模型**。

1. 重复以下步骤以创建 `Output` 模型和 `Result` 模型。

   对于 `Output` 模型，为**模型架构**输入以下内容：

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type": "object",
       "properties": {
           "c": {"type":"number"}
       },
       "title": "Output"
   }
   ```

   对于 `Result` 模型，为**模型架构**输入以下内容。将 API ID `abc123` 替换为您的 API ID。

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type":"object",
       "properties":{
           "input":{
               "$ref":"https://apigateway.amazonaws.com/restapis/abc123/models/Input"
           },
           "output":{
               "$ref":"https://apigateway.amazonaws.com/restapis/abc123/models/Output"
           }
       },
       "title":"Result"
   }
   ```

## 设置 GET/方法查询参数
<a name="simple-calc-lambda-api-set-up-get-method-query-parameters"></a>

对于 `GET /?a=..&b=..&op=..` 方法，查询参数在 **Method Request (方法请求)** 中声明：

**设置 GET / URL 查询字符串参数**

1. 在**方法请求**部分，为根 (`/`) 资源上的 `GET` 方法选择**编辑**。

1. 选择 **URL 查询字符串参数**并执行以下操作：

   1. 选择**添加查询字符串**。

   1. 在**名称**中，输入 **a**。

   1. 保持**必填**和**缓存**为已关闭状态。

   1. 将**缓存**保持为关闭状态。

   重复相同的步骤，创建一个名为 **b** 的查询字符串和一个名为 **op** 的查询字符串。

1. 选择**保存**。

## 将负载的数据模型设置为后端的输入
<a name="simple-calc-lambda-api-set-up-post-method-body-data-type"></a>

对于 `POST /` 方法，我们创建了 `Input` 模型，并将其添加到方法请求中以定义输入数据的形状。

**将负载的数据模型设置为后端的输入**

1. 在**方法请求**部分，为根 (`/`) 资源上的 `POST` 方法选择**编辑**。

1. 选择**请求正文**。

1. 选择**添加模型**。

1. 对于**内容类型**，输入 **application/json**。

1. 对于**模型**，选择**输入**。

1. 选择**保存**。

使用此模型，您的 API 客户可以通过实例化 `Input` 对象来调用开发工具包以指定输入。若不使用此模型，您的客户将需要创建词典对象来表示 Lambda 函数的 JSON 输入。

## 为后端的结果输出设置数据模型
<a name="simple-calc-lambda-api-set-up-all-methods-result-data-type"></a>

对于所有三种方法，我们将创建 `Result` 模型并将其添加到方法的 `Method Response` 中，以定义 Lambda 函数返回的输出的形状。

**为后端的结果输出设置数据模型**

1. 选择 **/\$1a\$1/\$1b\$1/\$1op\$1** 资源，然后选择 **GET** 方法。

1. 在**方法响应**选项卡的**响应 200** 下，选择**编辑**。

1. 在**响应正文**下，选择**添加模型**。

1. 对于**内容类型**，输入 **application/json**。

1. 对于**模型**，选择**结果**。

1. 选择**保存**。

使用此模型，您的 API 客户可以通过读取 `Result` 对象的属性来解析成功的输出。若不使用此模型，您的客户将需要创建词典对象来表示 JSON 输出。