

# 教程：利用 Lambda 代理集成创建 REST API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda"></a>

[Lambda 代理集成](set-up-lambda-proxy-integrations.md) 是一种轻量型、灵活的 API Gateway API 集成类型，可让您能够使用 Lambda 函数集成 API 方法（或整个 API）。Lambda 函数可以用 [Lambda 支持的任何语言](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)编写。由于这是代理集成，因此您可以随时更改 Lambda 函数实现，而无需重新部署您的 API。

在本教程中，您将执行以下操作：
+ 创建“Hello, World\$1” 要作为 API 的后端的 Lambda 函数。
+ 创建并测试“Hello, World\$1” API 与 Lambda 代理集成。

**Topics**
+ [创建“Hello, World\$1” Lambda 函数](#api-gateway-proxy-integration-create-lambda-backend)
+ [创建“Hello, World\$1” API](#api-gateway-create-api-as-simple-proxy-for-lambda-build)
+ [部署并测试 API](#api-gateway-create-api-as-simple-proxy-for-lambda-test)

## 创建“Hello, World\$1” Lambda 函数
<a name="api-gateway-proxy-integration-create-lambda-backend"></a>

**创建“Hello, World\$1” Lambda 控制台中的 Lambda 函数**

1. 通过以下网址登录 Lambda 控制台：[https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/lambda)。

1. 在 AWS 导航栏上，选择 [AWS 区域](https://docs.aws.amazon.com/general/latest/gr/apigateway.html)。
**注意**  
请注意您创建 Lambda 函数时所在的区域。在创建 API 时，会需要它。

1. 在导航窗格中，选择**函数**。

1. 选择**创建函数**。

1. 选择**从头开始创作**。

1. 在**基本信息**中，执行以下操作：

   1. 在**函数名称**中，输入 **GetStartedLambdaProxyIntegration**。

   1. 在**运行时**中，选择受支持的最新 **Node.js** 或 **Python** 运行时。

   1. 对于**架构**，请保留默认设置。

   1. 在**权限**下，展开**更改默认执行角色**。在**执行角色**下拉列表中，选择**从 AWS 策略模板创建新角色**。

   1. 在**角色名称**中，输入 **GetStartedLambdaBasicExecutionRole**。

   1. 将**策略模板**字段留空。

   1. 选择**创建函数**。

1. 在内联代码编辑器的**函数代码**下，复制/粘贴以下代码：

------
#### [ Node.js ]

   ```
   export const handler = async(event, context) => {
       console.log('Received event:', JSON.stringify(event, null, 2));
       var res ={
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           }
       };
       var greeter = 'World';
       if (event.greeter && event.greeter!=="") {
           greeter =  event.greeter;
       } else if (event.body && event.body !== "") {
           var body = JSON.parse(event.body);
           if (body.greeter && body.greeter !== "") {
               greeter = body.greeter;
           }
       } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
           greeter = event.queryStringParameters.greeter;
       } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
           greeter = event.multiValueHeaders.greeter.join(" and ");
       } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
           greeter = event.headers.greeter;
       } 
       res.body = "Hello, " + greeter + "!";
       return res
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       greeter = 'World'
   
       try:
           if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                   event['queryStringParameters']['greeter'] is not None):
               greeter = event['queryStringParameters']['greeter']
       except KeyError:
           print('No greeter')
   
       try:
           if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                   event['multiValueHeaders']['greeter'] is not None):
               greeter = " and ".join(event['multiValueHeaders']['greeter'])
       except KeyError:
           print('No greeter')
   
       try:
           if (event['headers']) and (event['headers']['greeter']) and (
                   event['headers']['greeter'] is not None):
               greeter = event['headers']['greeter']
       except KeyError:
           print('No greeter')
   
       if (event['body']) and (event['body'] is not None):
           body = json.loads(event['body'])
           try:
               if (body['greeter']) and (body['greeter'] is not None):
                   greeter = body['greeter']
           except KeyError:
               print('No greeter')
   
       res = {
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           },
           "body": "Hello, " + greeter + "!"
       }
   
       return res
   ```

------

1. 选择**部署**。

## 创建“Hello, World\$1” API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-build"></a>

现在为您的“Hello, World\$1”创建 API。使用 API Gateway 控制台的 Lambda 函数。

**创建“Hello, World\$1” API**

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

1. 如果您是第一次使用 API Gateway，您会看到一个介绍服务特征的页面。在 **REST API** 下，选择**生成**。当**创建示例 API** 弹出框出现时，选择**确定**。

   如果这不是您首次使用 API Gateway，请选择**创建 API**。在 **REST API** 下，选择**生成**。

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

1. （可选）对于**描述**，输入描述。

1. 将 **API 端点类型**设置保留为**区域**。

1. 为 **IP 地址类型**选择 **IPv4**。

1. 选择**创建 API**。

创建 API 后，您将创建一个资源。通常情况下，根据应用程序逻辑将 API 资源组织成资源树形式。在本示例中，您将创建一个 **/helloworld** 资源。

**创建资源**

1. 选择**创建资源**。

1. 将**代理资源**保持为关闭状态。

1. 将**资源路径**保持为 `/`。

1. 对于**资源名称**，输入 **helloworld**。

1. 将 **CORS（跨源资源共享）**保持为关闭状态。

1. 选择**创建资源**。

 在代理集成中，整个请求将通过表示任何 HTTP 方法的“捕获全部”`ANY` 方法按原样发送到后端 Lambda 函数。实际的 HTTP 方法由客户端在运行时指定。`ANY` 方法可让您对所有支持的 HTTP 方法使用单个 API 方法设置：`DELETE`、`GET`、`HEAD`、`OPTIONS`、`PATCH`、`POST` 和 `PUT`。

**创建 `ANY` 方法**

1. 选择 **/helloworld** 资源，然后选择**创建方法**。

1. 对于**方法类型**，选择 **ANY**。

1. 对于**集成类型**，选择 **Lambda 函数**。

1. 打开 **Lambda 代理集成**。

1. 对于 **Lambda 函数**，选择您创建 Lambda 函数的 AWS 区域，然后输入函数名称。

1. 要使用默认超时值 29 秒，请保持**默认超时**处于开启状态。要设置自定义超时，请选择**默认超时**，然后输入一个介于 `50` 到 `29000` 毫秒之间的超时值。

1. 选择**创建方法**。

## 部署并测试 API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test"></a>

**部署 API**

1. 选择**部署 API**。

1. 对于**阶段**，选择**新建阶段**。

1. 对于**阶段名称**，输入 **test**。

1. （可选）对于**描述**，输入描述。

1. 选择**部署**。

1. 在**阶段详细信息**下，选择复制图标以复制您 API 的调用 URL。

### 使用浏览器和 cURL 来通过 Lambda 代理集成测试 API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test-curl"></a>

您可以使用浏览器或 [cURL](https://curl.se/) 来测试您的 API。

要仅使用查询字符串参数测试 `GET` 请求，您可以在浏览器地址栏中输入 API 的 `helloworld` 资源的 URL。

要创建 API 的 `helloworld` 资源的 URL，请将资源 `helloworld` 和查询字符串参数 `?greeter=John` 附加到您的调用 URL。URL 应类似以下内容。

```
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John
```

对于其他方法，您必须使用更高级的 REST API 测试实用程序，如 [POSTMAN](https://www.postman.com/) 或 [cURL](https://curl.se/)。本教程使用的是 cURL。以下 cURL 命令示例假定您的计算机上已安装 cURL。

**使用 cURL 测试已部署的 API：**

1. 打开终端窗口。

1. 复制以下 cURL 命令并粘贴到终端窗口中，将调用 URL 替换为在上一步中复制的调用 URL，并在该 URL 的末尾添加 **/helloworld**。
**注意**  
如果您在 Windows 上运行命令，请改用以下语法：  

   ```
   curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
   ```

   1. 使用查询字符串参数 `?greeter=John` 调用 API：

      ```
      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
      ```

   1. 使用标头参数 `greeter:John` 调用 API：

      ```
      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -H 'greeter: John'
      ```

   1. 使用正文 `{"greeter":"John"}` 调用 API：

      ```
      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -d '{ "greeter": "John" }'
      ```

   在所有情况下，输出为具有以下响应正文的 200 响应：

   ```
   Hello, John!
   ```