Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

使用 HTTP 自定义集成构建 API

在本教程中,您将使用 Amazon API Gateway 控制台从头开始创建一个 API。您可以将控制台看作一个 API 设计室,并将其用于确定 API 的功能、试验其行为、构建 API 并分阶段部署您的 API。

使用 HTTP 自定义集成创建 API

本部分详细介绍了创建资源、在资源上公开方法、配置方法来实现所需的 API 行为以及测试和部署 API 的步骤。

  1. Create new API,选择 New API,在 API Name 中键入名称,并选择性地在 Description 中添加说明,然后选择 Create API

     手动创建 API

    现在创建了一个空 API。Resources 树显示了不带任何方法的根资源 (/)。在本练习中,我们将构建一个与 PetStore 网站 (http://petstore-demo-endpoint.execute-api.com) 进行 HTTP 自定义集成的 API。出于说明目的,我们将创建一个 /pets 资源作为根的子项,并在该资源上公开一个 GET 方法,以便客户端从 PetStore 网站上检索可用宠物项目列表。

  2. 要创建 /pets 资源,请依次选择根资源、ActionsCreate Resource

     创建资源

    Resource Name 中键入 Pets,保留提供的 Resource Path 值,然后选择 Create Resource

     创建资源 B 部分
  3. 要在 /pets 资源上公开 GET 方法,请选择 Actions,然后选择 Create Method

     在资源上创建方法

    /pets 资源节点下的列表中选择 GET,然后选择勾选标记图标以便完成创建方法。

     在资源上创建方法

    注意

    适用于 API 方法的其他选项包括:

    • POST,主要用于创建子资源。

    • PUT,主要用于更新现有资源 (也可用于创建子资源,但我们不建议这样做)。

    • DELETE,用于删除资源。

    • PATCH,用于更新资源。

    • HEAD,主要用在测试场景中。它与 GET 相同,但不能返回资源表示。

    • OPTIONS,可供调用方用于获取目标服务的可用通信选项相关信息。

    创建的方法尚未与后端集成。集成在下一步进行。

  4. 在方法的 Setup 窗格中,为 Integration type 选择 HTTP,从 HTTP method 下拉列表中选择 GET,键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets 作为 Endpoint URL 值,保留所有其他默认设置,然后选择 Save

    注意

    对于集成请求的 HTTP method,您必须选择一种受后端支持的方法。对于 HTTPMock integration,方法请求和集成请求可以使用相同的 HTTP 动词。对于其他集成类型,方法请求与集成请求可能会使用不同的 HTTP 动词。例如,要调用 Lambda 函数,集成请求必须使用 POST 调用该函数,而方法请求可能会根据 Lambda 函数的逻辑使用任何 HTTP 动词来进行调用。

     将 GET on Pets 与 PetStore 网站集成

    当方法设置完成后,您会看到 Method Execution 窗格,从中您可以进一步配置方法请求,以便添加查询字符串或自定义标头参数。您还可以更新集成请求,将来自方法请求的输入数据与后端所需的格式对应。

    PetStore 网站让您可以在给定页面上按宠物类型检索一系列 Pet 项目 (例如“Dog”或“Cat”)。它使用 typepage 查询字符串参数来接受此类输入。因此,我们必须将查询字符串参数添加到方法请求中,并将其映射到集成请求的相应查询字符串中。

  5. 在 GET 方法的 Method Execution 窗格中,选择 Method Request,为 Authorization 选择 AWS_IAM,展开 URL Query String Parameters 部分,然后选择 Add query string 以创建两个名为 typepage 的查询字符串。选择复选标记图标以保存新添加的查询字符串参数。

     将查询字符串添加 GET on Pets 方法请求

    客户端现在可以在提交请求时提供一个宠物类型和页码作为查询字符串参数。这些输入参数必须映射到集成的查询字符串参数中,以便将输入值转发到后端的 PetStore 网站。该方法使用 AWS_IAM,因此您必须对请求签名才能调用方法。

  6. 从方法的 Integration Request 页面,展开 URL Query String Parameters 部分。默认情况下,这些方法请求查询字符串参数映射到名称相同的集成请求查询字符串参数。我们的演示 API 使用此默认映射。我们会将其按原样保留。要将不同的方法请求参数映射到相应的集成请求参数中,请选择参数对应的铅笔图标来编辑映射表达式,如 Mapped from 列中所示。要将方法请求映射到不同的集成请求参数,请首先选择删除图标以删除现有的集成请求参数,然后选择 Add query string 以便指定新名称和所需的方法请求参数映射表达式。

     将 GET on Pets 查询字符串从方法请求映射到集成请求

    简单的演示 API 现在构建完成。接下来应该测试 API。

  7. 要使用 API Gateway 控制台测试 API,请在 GET /pets 方法的 Method Execution 窗格上选择 Test。在 Method Test 窗格中,在 typepage 查询字符串中分别输入 Dog2,然后选择 Test

     GET on Pets 方法的调用测试

    结果如下所示。(您可能需要向下滚动才能看到测试结果。)

     GET on Pets 方法的调用测试结果

    测试成功后,我们可以部署 API 以使其公开可用。

  8. 要部署 API,请选择 API,然后从 Actions 下拉菜单中选择 Deploy API

     部署 API

    Deploy API 对话框中,选择一个阶段 (对于第一次部署,可以选择 [New Stage]);在 Stage name 输入字段中输入名称 (例如,“test”、“prod”、“dev”等);(可选) 在 Stage description 和/或 Deployment description 中提供说明;然后选择 Deploy

     部署 API 第 2 部分

    部署后,您就可以获取 API 终端节点的调用 URL (Invoke URL)。

    如果 GET 方法支持开放访问 (即,如果该方法的授权类型设置为 NONE),那么您可以双击 Invoke URL 链接以在您的默认浏览器中调用该方法。如果需要,您还可以将必要的查询字符串参数附加到调用 URL。使用此处所述的 AWS_IAM 授权类型时,您必须使用 AWS 账户的 IAM 用户的访问密钥 ID 和相应私有密钥对请求签名。要执行这一操作,您必须使用支持签名版本 4 (SigV4) 协议的客户端。使用 AWS 开发工具包或者 Postman 应用程序或 cURL 命令之一的应用程序就属于此类客户端。要调用具有负载的 POST、PUT 或 PATCH 方法,您也需要使用这样的客户端来处理负载。

    要在 Postman 中调用此 API 方法,请将查询字符串参数附加到特定于阶段的方法调用 URL (如上一张图片所示),以便创建完整的方法请求 URL:

    https://api-id.execute-api.region.amazonaws.com/test/pets?type=Dog&page=2

    在浏览器的地址栏中指定此 URL。选择 GET 作为 HTTP 动词。在 Authorization 选项卡下为 Type 选项选择 AWS Signature,然后在发送请求之前指定以下所需属性:

    • 对于 AccessKey,键入调用方的 AWS 访问密钥,即 AWS IAM 中预配置的访问密钥。

    • 对于 SecretKey,键入调用方的 AWS 私有密钥,即首次创建访问密钥时 AWS IAM 中预配置的私有密钥。

    • 对于 AWS Region,键入托管 API 的 AWS 地区,即调用 URL 中指定的地区。

    • 对于 Service Name,为 API Gateway 执行服务键入 execute-api

    如果您使用开发工具包创建客户端,您可以调用开发工具包公开的方法来对请求签名。有关具体实施方式,请参阅您选择的 AWS 开发工具包

    注意

    如果您的 API 发生更改,您必须重新部署 API 以便让新功能或更新后的功能生效,然后才能再次调用请求 URL。

映射 API Gateway API 的请求参数

在本演练中,我们将介绍如何将方法请求参数映射到 API Gateway API 的相应集成请求参数。我们使用 HTTP 自定义集成创建示例 API 并使用它来演示如何使用 API Gateway 将方法请求参数映射到相应集成请求参数。然后,我们将访问以下可公开访问的 HTTP 终端节点:

http://petstore-demo-endpoint.execute-api.com/petstore/pets

如果复制上述 URL,将其粘贴到 Web 浏览器的地址栏中并按 EnterReturn,则会获得以下 JSON 格式的响应正文:

[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]

前述终端节点可以使用两个查询参数:typepage。例如,将 URL 更改为以下形式:

http://petstore-demo-endpoint.execute-api.com/petstore/pets?type=cat&page=2

您将收到以下 JSON 格式的响应负载,第 2 页仅显示 cat (猫):

[ { "id": 4, "type": "cat", "price": 999.99 }, { "id": 5, "type": "cat", "price": 249.99 }, { "id": 6, "type": "cat", "price": 49.97 } ]

此终端节点还支持使用项目 ID,如 URL 路径参数所示。例如,浏览到以下位置:

http://petstore-demo-endpoint.execute-api.com/petstore/pets/1

将显示关于 ID 为 1 的项目的以下 JSON 格式信息:

{ "id": 1, "type": "dog", "price": 249.99 }

除了支持 GET 操作外,此终端节点还处理具有负载的 POST 请求。例如,使用 Postman 将 POST 方法请求发送至以下位置:

http://petstore-demo-endpoint.execute-api.com/petstore/pets

包括标头 Content-type: application/json 和以下请求正文:

{ "type": "dog", "price": 249.99 }

您将在响应正文中收到以下 JSON 对象:

{ "pet": { "type": "dog", "price": 249.99 }, "message": "success" }

我们现在通过使用此 PetStore 网站的 HTTP 自定义集成来构建 API Gateway API,从而公开这些内容和其他功能。任务包括以下这些:

  • 使用充当 HTTP 终端节点 http://petstore-demo-endpoint.execute-api.com/petstore/pets 的代理的 https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets 资源创建 API。

  • 启用 API 以接受两个方法请求查询参数 petTypepetsPage,将它们分别映射到集成请求的 typepage 查询参数,并将请求传递到 HTTP 终端节点。

  • 支持 API 方法请求 URL 上的 {petId} 路径参数指定一个项目 ID,将其映射到集成请求 URL 中的 {id} 路径参数,并将请求发送至 HTTP 终端节点。

  • 支持方法请求接受后端网站所定义格式的 JSON 负载,并通过集成请求将负载不加修改地传递到后端 HTTP 终端节点。

注意

请注意本演练的步骤中使用的大小写。在要求大写字母时键入小写字母 (或相反情况) 可能会在稍后的演练中导致错误。

先决条件

在开始本演练之前,您应执行以下操作:

  1. 完成为构建 API Gateway API 做好准备中的步骤,包括为 IAM 用户分配 API Gateway 访问权限。

  2. 至少应按照 使用 HTTP 自定义集成构建 API 中的步骤操作,在 API Gateway 控制台中创建名为 MyDemoAPI 的新 API。

步骤 1:创建资源

在此步骤中,您将创建三个支持 API 与 HTTP 终端节点交互的资源。

创建第一个资源

  1. Resources 窗格中,选择由一个正斜杠 (/) 表示的资源根,然后从 Actions 下拉菜单中选择 Create Resource

  2. 对于 Resource Name,键入 petstorewalkthrough

  3. 对于 Resource Path,接受默认值 /petstorewalkthrough,然后选择 Create Resource

创建第二个资源

  1. Resources 窗格中,选择 /petstorewalkthrough,然后选择 Create Resource

  2. 对于 Resource Name,键入 pets

  3. 对于 Resource Path,接受默认值 /petstorewalkthrough/pets,然后选择 Create Resource

创建第三个资源

  1. Resources 窗格中,选择 /petstorewalkthrough/pets,然后选择 Create Resource

  2. 对于 Resource Name,键入 petId。这将映射到 HTTP 终端节点中的项目 ID。

  3. 对于 Resource Path,使用 {petId} 覆盖 petid。在 petId 两边使用大括号 ({ }) 以确保显示 /petstorewalkthrough/pets/{petId},然后选择 Create Resource

    这将映射到 HTTP 终端节点中的 /petstore/pets/my-item-id

步骤 2:创建和测试方法

在此步骤中,您将方法与后端 HTTP 终端节点集成,将 GET 方法请求参数映射到相应的集成请求参数,然后测试这些方法。

设置和测试第一个 GET 方法

此过程演示了以下步骤:

  • 创建方法请求 GET /petstorewalkthrough/pets,并将其与集成请求 GET http://petstore-demo-endpoint.execute-api.com/petstore/pets 进行集成。

  • 将方法请求查询参数 petTypepetsPage 分别映射到集成请求查询字符串参数 typepage

  1. Resources 窗格中,选择 /petstorewalkthrough/pets,再从 Actions 菜单中选择 Create Method,然后从方法名的下拉列表中的 /pets 下选择 GET

  2. /petstorewalkthrough/pets - GET - Setup 窗格中,为 Integration type 选择 HTTP,然后为 HTTP method 选择 GET

  3. 对于 Endpoint URL,键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets

  4. 选择 Save

  5. Method Execution 窗格中,选择 Method Request,然后选择 URL Query String Parameters 旁的箭头。

  6. 选择 Add query string

  7. 对于 Name,键入 petType

    这可指定 API 方法请求中的 petType 查询参数。

  8. 选择复选标记图标以完成方法请求 URL 查询字符串参数的创建。

  9. 再次选择 Add query string

  10. 对于 Name,键入 petsPage

    这可指定 API 方法请求中的 petsPage 查询参数。

  11. 选择复选标记图标以完成方法请求 URL 查询字符串参数的创建。

  12. 选择 Method Execution,再选择 Integration Request,然后选择 URL Query String Parameters 旁的箭头。

  13. 删除从 method.request.querystring.petType 映射的 petType 条目,以及从 method.request.querystring.petsPage 映射的 petsPage 条目。您执行此步骤是因为终端节点需要请求 URL 的名为 typepage 的查询字符串参数,而不是默认值。

  14. 选择 Add query string

  15. 对于 Name,键入 type。这会创建集成请求 URL 所需的查询字符串参数。

  16. 对于 Mapped from,键入 method.request.querystring.petType

    这可将方法请求的 petType 查询参数映射到集成请求的 type 查询参数。

  17. 选择复选标记图标以完成集成请求 URL 查询字符串参数的创建。

  18. 再次选择 Add query string

  19. 对于 Name,键入 page。这会创建集成请求 URL 所需的查询字符串参数。

  20. 对于 Mapped from,键入 method.request.querystring.petsPage

    这可将方法请求的 petsPage 查询参数映射到集成请求的 page 查询参数。

  21. 选择复选标记图标以完成集成请求 URL 查询字符串参数的创建。

  22. 选择 Method Execution。在 Client 框中,选择 TEST。在 Query Strings 区域中,为 petType 键入 cat。对于 petsPage,键入 2

  23. 选择 Test。如果成功,Response Body 将显示以下内容:

    [ { "id": 4, "type": "cat", "price": 999.99 }, { "id": 5, "type": "cat", "price": 249.99 }, { "id": 6, "type": "cat", "price": 49.97 } ]

设置和测试第二个 GET 方法

此过程演示了以下步骤:

  • 创建方法请求 GET /petstorewalkthrough/pets/{petId},并将其与集成请求 GET http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id} 进行集成。

  • 将方法请求路径参数 petId 映射到集成请求路径参数 id

  1. Resources 列表中,选择 /petstorewalkthrough/pets/{petId},从 Actions 下拉菜单中选择 Create Method,然后选择 GET 作为方法的 HTTP 谓词。

  2. Setup 窗格中,为 Integration type 选择 HTTP,并为 HTTP method 选择 GET

  3. 对于 Endpoint URL,键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}

  4. 选择 Save

  5. Method Execution 窗格中,选择 Integration Request,然后选择 URL Path Parameters 旁的箭头。

  6. 选择 Add path

  7. 对于 Name,键入 id

  8. 对于 Mapped from,键入 method.request.path.petId

    这可将方法请求路径参数 petId 映射到集成请求路径参数 id

  9. 选择复选标记图标以完成 URL 路径参数的创建。

  10. 选择 Method Execution,然后在 Client 框中,选择 TEST。在 Path 区域中,为 petId 键入 1

  11. 选择 Test。如果成功,Response Body 将显示以下内容:

    { "id": 1, "type": "dog", "price": 249.99 }

设置和测试 POST 方法

此过程演示了以下步骤:

  • 创建方法请求 POST /petstorewalkthrough/pets,并将其与集成请求 POST http://petstore-demo-endpoint.execute-api.com/petstore/pets 进行集成。

  • 将方法请求 JSON 负载传递至集成请求负载,而不作修改。

  1. Resources 窗格中,选择 /petstorewalkthrough/pets,再从 Actions 下拉菜单中选择 Create Method,然后选择 POST 作为方法的 HTTP 谓词。

  2. Setup 窗格中,为 Integration type 选择 HTTP,并为 HTTP method 选择 POST

  3. 对于 Endpoint URL,键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets

  4. 选择 Save

  5. Method Execution 窗格中的 Client 框中,选择 TEST。展开 Request Body,然后键入以下内容:

    { "type": "dog", "price": 249.99 }
  6. 选择 Test。如果成功,Response Body 将显示以下内容:

    { "pet": { "type": "dog", "price": 249.99 }, "message": "success" }

步骤 3:部署 API

在此步骤中,您将部署 API,以便在 API Gateway 控制台外部对其进行调用。

部署 API

  1. Resources 窗格中,选择 Deploy API

  2. 对于 Deployment stage,选择 test

    注意

    输入必须是 UTF-8 编码 (即未本地化) 的文本。

  3. 对于 Deployment description,键入 Calling HTTP endpoint walkthrough

  4. 选择 Deploy

步骤 4:测试 API

在此步骤中,您将转到 API Gateway 控制台外部,并使用您的 API 访问 HTTP 终端节点。

  1. Stage Editor 窗格的 Invoke URL 旁边,将 URL 复制到剪贴板。它应该如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test
  2. 将此 URL 粘贴到新浏览器标签页的地址框中。

  3. 附加 /petstorewalkthrough/pets,使之如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets

    浏览到该 URL。此时应显示以下信息:

    [ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]
  4. petstorewalkthrough/pets 后面键入 ?petType=cat&petsPage=2,使之如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets?petType=cat&petsPage=2
  5. 浏览到该 URL。此时应显示以下信息:

    [ { "id": 4, "type": "cat", "price": 999.99 }, { "id": 5, "type": "cat", "price": 249.99 }, { "id": 6, "type": "cat", "price": 49.97 } ]
  6. petstorewalkthrough/pets 后面,将 ?petType=cat&petsPage=2 替换为 /1,使之如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets/1
  7. 浏览到该 URL。此时应显示以下信息:

    { "id": 1, "type": "dog", "price": 249.99 }
  8. 使用 Web 调试代理工具或 cURL 命令行工具将 POST 方法请求发送至上一过程中的 URL。附加 /petstorewalkthrough/pets,使之如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets

    附加以下标头:

    Content-Type: application/json

    将以下代码添加到请求正文:

    { "type": "dog", "price": 249.99 }

    例如,如果您使用 cURL 命令行工具,请运行类似以下内容的命令:

    curl -H "Content-Type: application/json" -X POST -d "{\"type\": \"dog\",\"price\": 249.99}" https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/pets

    响应正文中应返回以下信息:

    { "pet": { "type": "dog", "price": 249.99 }, "message": "success" }

本演练到此结束。

后续步骤

下一个演练将演示如何在 API Gateway 中使用模型和映射,以将 API 调用的输出从一种数据格式转换为另一种数据格式。请参阅 映射响应负载

映射响应负载

在本次演练中,我们将演示如何在 API Gateway 中使用模型和映射模板,以将 API 调用的输出从一个数据架构转换为另一个数据架构。本演练以Amazon API Gateway 入门映射 API Gateway API 的请求参数中的说明和概念为基础。如果您尚未完成这些演练,我们建议首先将它们完成。

本演练将使用 API Gateway 从可公开访问的 HTTP 终端节点和您将创建的 AWS Lambda 函数获取示例数据。HTTP 终端节点和 Lambda 函数会返回相同的示例数据:

[ { "id": 1, "type": "dog", "price": 249.99 }, { "id": 2, "type": "cat", "price": 124.99 }, { "id": 3, "type": "fish", "price": 0.99 } ]

您将使用模型和映射模板将此数据转换为一个或多个输出格式。在 API Gateway 中,模型定义某些数据的格式 (又称为架构或形状)。 在 API Gateway 中,使用映射模板将一些数据从一种格式转换为另一种格式。 有关更多信息,请参阅为请求和响应映射创建模型和映射模板

第一个模型和映射模板用于将 id 重命名为 number,将 type 重命名为 class,以及将 price 重命名为 salesPrice,如下所示:

[ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]

第二个模型和映射模板用于将 idtype 合并到 description 中,并将 price 重命名为 askingPrice,如下所示:

[ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]

第三个模型和映射模板用于将 idtypeprice 合并成一组 listings,如下所示:

{ "listings": [ "Item 1 is a dog. The asking price is 249.99.", "Item 2 is a cat. The asking price is 124.99.", "Item 3 is a fish. The asking price is 0.99." ] }

步骤 1:创建模型

在此步骤中,您将创建四个模型。前三个模型表示可与 HTTP 终端节点和 Lambda 函数结合使用的数据输出格式。最后一个模型表示可与 Lambda 函数结合使用的数据输入架构。

创建第一个输出模型

  1. 通过 https://console.amazonaws.cn/apigateway 登录 API Gateway 控制台。

  2. 如果显示 MyDemoAPI,则选择 Models

  3. 选择 Create

  4. 对于 Model name,键入 PetsModelNoFlatten

  5. 对于 Content type,键入 application/json

  6. 对于 Model description,键入 Changes id to number, type to class, and price to salesPrice

  7. 对于 Model schema,键入以下与 JSON 架构兼容的定义:

    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelNoFlatten", "type": "array", "items": { "type": "object", "properties": { "number": { "type": "integer" }, "class": { "type": "string" }, "salesPrice": { "type": "number" } } } }
  8. 选择 Create model

创建第二个输出模型

  1. 选择 Create

  2. 对于 Model name,键入 PetsModelFlattenSome

  3. 对于 Content type,键入 application/json

  4. 对于 Model description,键入 Combines id and type into description, and changes price to askingPrice

  5. 对于 Model schema,键入以下内容:

    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelFlattenSome", "type": "array", "items": { "type": "object", "properties": { "description": { "type": "string" }, "askingPrice": { "type": "number" } } } }
  6. 选择 Create model

创建第三个输出模型

  1. 选择 Create

  2. 对于 Model name,键入 PetsModelFlattenAll

  3. 对于 Content type,键入 application/json

  4. 对于 Model description,键入 Combines id, type, and price into a set of listings

  5. 对于 Model schema,键入以下内容:

    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsModelFlattenAll", "type": "object", "properties": { "listings": { "type": "array", "items": { "type": "string" } } } }
  6. 选择 Create model

创建输入模型

  1. 选择 Create

  2. 对于 Model name,键入 PetsLambdaModel

  3. 对于 Content type,键入 application/json

  4. 对于 Model description,键入 GetPetsInfo model

  5. 对于 Model schema,键入以下内容:

    { "$schema": "http://json-schema.org/draft-04/schema#", "title": "PetsLambdaModel", "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "type": { "type": "string" }, "price": { "type": "number" } } } }
  6. 选择 Create model

步骤 2:创建资源

在此步骤中,您将创建四个资源。借助前三个资源,您将能够以三种输出格式从 HTTP 终端节点获取示例数据。最后一个资源将使您能够从输出架构中的 Lambda 函数获取示例数据,该架构将 idtype 合并到 description,并将 price 重命名为 askingPrice

创建第一个资源

  1. 在链接列表中,选择 Resources

  2. Resources 窗格中,选择 /petstorewalkthrough,然后选择 Create Resource

  3. 对于 Resource Name,键入 NoFlatten

  4. 对于 Resource Path,接受默认值 /petstorewalkthrough/noflatten,然后选择 Create Resource

创建第二个资源

  1. Resources 窗格中,选择 /petstorewalkthrough,然后选择 Create Resource

  2. 对于 Resource Name,键入 FlattenSome

  3. 对于 Resource Path,接受默认值 /petstorewalkthrough/flattensome,然后选择 Create Resource

创建第三个资源

  1. Resources 窗格中,选择 /petstorewalkthrough,然后选择 Create Resource

  2. 对于 Resource Name,键入 FlattenAll

  3. 对于 Resource Path,接受默认值 /petstorewalkthrough/flattenall,然后选择 Create Resource

创建第四个资源

  1. Resources 窗格中,选择 /petstorewalkthrough,然后选择 Create Resource

  2. 对于 Resource Name,键入 LambdaFlattenSome

  3. 对于 Resource Path,接受默认值 /petstorewalkthrough/lambdaflattensome,然后选择 Create Resource

步骤 3:创建 GET 方法

在此步骤中,您将为在上一步中创建的每个资源创建一个 GET 方法。

创建第一个 GET 方法

  1. Resources 列表中,选择 /petstorewalkthrough/flattenall,然后选择 Create Method

  2. 从下拉列表中选择 GET,然后选择对勾图标以保存您的选择。

  3. 在“Setup”窗格中,选择 HTTP 作为 Integration type,选择 GET 作为 HTTP method,在 Endpoint URL 中键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets,然后选择 Save

创建第二个 GET 方法

  1. Resources 列表中,选择 /petstorewalkthrough/lambdaflattensome,然后选择 Create Method

  2. 从下拉列表中选择 GET,然后选择对勾图标以保存您的选择。

  3. 在“Setup”窗格中,选择 Lambda Function 作为 Integration type,从 Lambda Region 下拉列表中选择创建 GetPetsInfo Lambda 函数的地区,选择 GetPetsInfo 作为 Lambda Function,然后选择 Save。当系统提示向 Lambda 函数添加权限时,选择 OK

创建第三个 GET 方法

  1. Resources 列表中,选择 /petstorewalkthrough/flattensome,然后选择 Create Method

  2. 从下拉列表中选择 GET,然后选择对勾图标以保存您的选择。

  3. 在“Setup”窗格中,选择 HTTP 作为 Integration type,选择 GET 作为 HTTP method,在 Endpoint URL 中键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets,然后选择 Save

创建第四个 GET 方法

  1. Resources 列表中,选择 /petstorewalkthrough/noflatten,然后选择 ActionsCreate Method

  2. 从下拉列表中选择 GET,然后选择对勾图标以保存您的选择。

  3. 在“Setup”窗格中,选择 HTTP 作为 Integration type,选择 GET 作为 HTTP method,在 Endpoint URL 中键入 http://petstore-demo-endpoint.execute-api.com/petstore/pets,然后选择 Save

步骤 4:创建 Lambda 函数

在此步骤中,您将创建一个可返回示例数据的 Lambda 函数。

创建 Lambda 函数

  1. 通过以下网址打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/

  2. 执行以下任一操作:

    • 如果出现欢迎页面,请选择 Get Started Now

    • 如果显示 Lambda: Function list 列表页面,请选择 Create a Lambda function

  3. 对于 Name,键入 GetPetsInfo

  4. 对于 Description,键入 Gets information about pets

  5. 对于 Code template,选择 None

  6. 输入以下代码:

    console.log('Loading event'); exports.handler = function(event, context, callback) { callback(null, [{"id": 1, "type": "dog", "price": 249.99}, {"id": 2, "type": "cat", "price": 124.99}, {"id": 3, "type": "fish", "price": 0.99}]); // SUCCESS with message };

    提示

    上述代码在 Node.js 中编写,console.log 将信息写入 Amazon CloudWatch 日志。event 包含对 Lambda 函数的输入。context 包含调用上下文。callback 返回结果 (对于 Node.js 4.3 及更高版本)。有关如何编写 Lambda 函数代码的更多信息,请参阅 AWS Lambda:工作原理中的“编程模型”部分,以及AWS Lambda 开发人员指南中的示例演练。

  7. 对于 Handler name,保留默认值 index.handler

  8. 对于 Role,选择您在使用 Lambda 集成构建 API Gateway API中创建的 Lambda 执行角色 APIGatewayLambdaExecRole

  9. 选择 Create Lambda function

  10. 在函数列表中,选择 GetPetsInfo 以显示函数的详细信息。

  11. 请记下您在其中创建此函数的 AWS 区域。稍后您将需要用到它。

  12. 在弹出列表中,选择 Edit or test function

  13. 对于 Sample event,替换显示有以下内容的任何代码:

    { }

    提示

    空的大括号意味着没有针对此 Lambda 函数的输入值。此函数仅返回包含宠物信息的 JSON 对象,因此无需在此使用这些键/值对。

  14. 选择 InvokeExecution result 显示 [{"id":1,"type":"dog","price":249.99},{"id":2,"type":"cat","price":124.99},{"id":3,"type":"fish","price":0.99}],这些内容也会写入 CloudWatch Logs 日志文件中。

  15. 选择 Go to function list

步骤 5:设置和测试方法

在此步骤中,您将配置方法响应、集成请求和集成响应,以指定与 HTTP 终端节点和 Lambda 函数关联的 GET 方法的输入和输出数据架构 (或模型)。您还将学习使用 API Gateway 控制台来测试对这些方法的调用。

为第一个 GET 方法设置集成,然后对其进行测试

  1. 从 API 的 Resources 树中,选择 /petstorewalkthrough/flattenall 节点下的 GET

  2. Method Execution 窗格中,选择 Method Response,然后选择 200 旁边的箭头。

  3. Response Models for 200 区域中,针对 application/json 选择铅笔图标以开始为方法输出设置模型。对于 Models,选择 PetsModelFlattenAll,然后选择对勾图标以保存设置。

  4. 选择 Method Execution,再选择 Integration Response,然后选择 200 旁边的箭头。

  5. 展开 Body Mapping Templates 部分,选择 Content-Type 下的 application/json

  6. 对于 Generate template from model,选择 PetsModelFlattenAll 以显示 PetsModelFlattenAll 模型后的映射模板作为起点。

  7. 按如下所示修改映射模板代码:

    #set($inputRoot = $input.path('$')) { "listings" : [ #foreach($elem in $inputRoot) "Item number $elem.id is a $elem.type. The asking price is $elem.price."#if($foreach.hasNext),#end #end ] }
  8. 选择 Save

  9. 选择 Method Execution,在 Client 框中选择 TEST,然后选择 Test。如果成功,Response Body 将显示以下内容:

    { "listings" : [ "Item number 1 is a dog. The asking price is 249.99.", "Item number 2 is a cat. The asking price is 124.99.", "Item number 3 is a fish. The asking price is 0.99." ] }

为第二个 GET 方法设置集成,然后对其进行测试

  1. 从 API 的 Resources 树中,选择 /petstorewalkthrough/lambdaflattensome 节点下的 GET

  2. Method Execution 中,选择 Method Response。然后选择 200 旁边的箭头以展开该部分。

  3. Response Models for 200 区域中,选择 application/json 内容类型一行中的铅笔图标。选择 PetsModelFlattenSome 作为 Models,然后选择对勾图标以保存选择。

  4. 返回 Method Execution。选择 Integration Response,然后选择 200 旁边的箭头。

  5. Body Mapping Templates 部分中,选择 Content-Type 下的 application/json

  6. 对于 Generate template,选择 PetsModelFlattenSome 以显示此方法输出的映射脚本模板。

  7. 按如下所示修改代码,然后选择 Save

    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description" : "Item $elem.id is a $elem.type.", "askingPrice" : $elem.price }#if($foreach.hasNext),#end #end ]
  8. 选择 Method Execution,在 Client 框中选择 TEST,然后选择 Test。如果成功,Response Body 将显示以下内容:

    [ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]

为第三个 GET 方法设置集成,然后对其进行测试

  1. 从 API 的 Resources 树中,选择 /petstorewalkthrough/flattensome 节点下的 GET

  2. Method Execution 窗格中,选择 Method Response

  3. 选择 200 旁边的箭头。

  4. Response Models for 200 区域中,对于 application/json,选择铅笔图标。对于 Models,选择 PetsModelFlattenSome,然后选择对勾图标以保存选择。

  5. 返回 Method Execution 并选择 Integration Response

  6. 选择 200 旁边的箭头以展开该部分。

  7. 展开 Body Mapping Templates 区域。对于 Content-Type,选择 application/json。对于 Generate template,选择 PetsModelFlattenSome 以显示此方法输出的映射脚本模板。

  8. 按如下所示修改代码:

    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "description": "Item $elem.id is a $elem.type.", "askingPrice": $elem.price }#if($foreach.hasNext),#end #end ]
  9. 选择 Save

  10. 返回到 Method Execution 并选择 Client 框中的 TEST。然后选择 Test。如果成功,Response Body 将显示以下内容:

    [ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]

为第四个 GET 方法设置集成,然后对其进行测试

  1. 从 API 的 Resources 树中,选择 /petstorewalkthrough/noflatten 节点下的 GET

  2. Method Execution 窗格中,选择 Method Response,然后展开 200 部分。

  3. Response Models for 200 区域中,对于 application/json,选择铅笔图标以更新此方法的响应模型。

  4. 选择 PetsModelNoFlatten 作为 application/json 内容类型的模型,然后选择对勾图标以保存选择。

  5. 选择 Method Execution,再选择 Integration Response,然后选择 200 旁边的箭头以展开该部分。

  6. 展开 Mapping Templates 部分。对于 Content-Type,选择 application/json。对于 Generate templates,选择 PetsModelNoFlatten 以显示此方法输出的映射脚本模板。

  7. 按如下所示修改代码:

    #set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot) { "number": $elem.id, "class": "$elem.type", "salesPrice": $elem.price }#if($foreach.hasNext),#end #end ]
  8. 选择 Save

  9. 返回到 Method Execution,在 Client 框中选择 TEST,然后选择 Test。如果成功,Response Body 将显示以下内容:

    [ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]

步骤 6:部署 API

在此步骤中,您将部署 API,以便在 API Gateway 控制台外部对其进行调用。

部署 API

  1. Resources 窗格中,选择 Deploy API

  2. 对于 Deployment stage,选择 test

  3. 对于 Deployment description,键入 Using models and mapping templates walkthrough

  4. 选择 Deploy

步骤 7:测试 API

在此步骤中,您将转到 API Gateway 控制台外部,与 HTTP 终端节点和 Lambda 函数进行交互。

  1. Stage Editor 窗格的 Invoke URL 旁边,将 URL 复制到剪贴板。它应该如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test
  2. 将此 URL 粘贴到新浏览器标签页的地址框中。

  3. 附加 /petstorewalkthrough/noflatten,使之如下所示:

    https://my-api-id.execute-api.region-id.amazonaws.com/test/petstorewalkthrough/noflatten

    浏览到该 URL。此时应显示以下信息:

    [ { "number": 1, "class": "dog", "salesPrice": 249.99 }, { "number": 2, "class": "cat", "salesPrice": 124.99 }, { "number": 3, "class": "fish", "salesPrice": 0.99 } ]
  4. petstorewalkthrough/ 后面的 noflatten 替换为 flattensome

  5. 浏览到该 URL。此时应显示以下信息:

    [ { "description": "Item 1 is a dog.", "askingPrice": 249.99 }, { "description": "Item 2 is a cat.", "askingPrice": 124.99 }, { "description": "Item 3 is a fish.", "askingPrice": 0.99 } ]
  6. petstorewalkthrough/ 后面的 flattensome 替换为 flattenall

  7. 浏览到该 URL。此时应显示以下信息:

    { "listings" : [ "Item number 1 is a dog. The asking price is 249.99.", "Item number 2 is a cat. The asking price is 124.99.", "Item number 3 is a fish. The asking price is 0.99." ] }
  8. petstorewalkthrough/ 后面的 flattenall 替换为 lambdaflattensome

  9. 浏览到该 URL。此时应显示以下信息:

    [ { "description" : "Item 1 is a dog.", "askingPrice" : 249.99 }, { "description" : "Item 2 is a cat.", "askingPrice" : 124.99 }, { "description" : "Item 3 is a fish.", "askingPrice" : 0.99 } ]

步骤 8:清除

如果您不再需要为本演练创建的 Lambda 函数,现在可以将其删除。您也可以删除附带的 IAM 资源。

警告

如果您删除您的 API 所依赖的某个 Lambda 函数,这些 API 将不再有效。Lambda 函数删除操作无法撤消。如果您要再次使用 Lambda 函数,必须重新创建该函数。

如果您删除 Lambda 函数依赖的 IAM 资源,Lambda 函数及依赖于该函数的任何 API 将不再有效。IAM 资源删除操作无法撤消。如果您要再次使用 IAM 资源,必须重新创建该资源。如果您打算用为此演练及其他演练创建的资源继续试验,请不要删除 Lambda 调用角色或 Lambda 执行角色。

API Gateway 目前不支持停用或删除不再起作用的 API。

删除 Lambda 函数

  1. 通过以下网址登录 AWS 管理控制台并打开 AWS Lambda 控制台:https://console.amazonaws.cn/lambda/

  2. Lambda: Function list 页面的函数列表中,选择 GetPetsInfo 旁边的按钮,然后依次选择 ActionsDelete。当系统提示时,再次选择 Delete

删除相关联的 IAM 资源

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. Details 区域中,选择 Roles

  3. 选择 APIGatewayLambdaExecRole,然后选择 Role ActionsDelete Role。在系统提示时,选择 Yes, Delete

  4. Details 区域中,选择 Policies

  5. 选择 APIGatewayLambdaExecPolicy,然后选择 Policy ActionsDelete。系统提示时,选择 Delete

现在,您已经完成了本演练。

后续步骤

您可能想开始下一个演练,其中介绍了如何创建 API GatewayAPI 以访问 AWS 服务。请参阅 使用 AWS 集成构建 API Gateway API