练习 - 通过函数应用在 API 管理中创建新的 API

已完成

若要将 Azure Functions 作为单个 API 的一部分呈现给用户,可以将它们添加到 Azure API 管理中。

在在线商店公司中,开发人员创建了多个 Azure Functions 作为微服务。 每个函数都实现商店的一小部分功能。 你想将这些函数组装成单个 API。

在本练习中,你将新建 API 管理实例,然后向它添加 Product Details 函数。

创建函数

在以下步骤中,向 Azure API 管理添加 Azure 函数应用。 稍后,将第二个函数应用添加到同一 API 管理实例,以便从多个函数创建单个无服务器 API。 首先,让我们使用脚本来创建函数:

  1. 若要克隆函数项目,请在右侧的 Azure Cloud Shell 中运行以下命令。

    git clone https://github.com/MicrosoftDocs/mslearn-apim-and-functions.git ~/OnlineStoreFuncs
    
  2. 在 Cloud Shell 中运行以下命令,为此练习设置所需的 Azure 资源。

    cd ~/OnlineStoreFuncs
    bash setup.sh
    

    setup.sh 脚本会在为此模块激活的沙盒资源组中创建两个函数应用。 如下图所示,每个应用托管一个函数 - OrderDetailsProductDetails。 该脚本还为这些函数设置存储帐户。 这些函数在 azurewebsites.net 域中均具有 URL。 函数名称包含随机数字以确保唯一性。 此脚本需要几分钟才能完成。

    Diagram illustrating the results of the setup.sh script and how the functions relate to the overall application's design.

测试 ProductDetails 函数

现在,在将 ProductDetails 函数添加到 API Management 之前,让我们对其进行测试,看看它的行为如何。

  1. 使用激活沙盒时所用的同一帐户登录到 Azure 门户

  2. 在 Azure 门户菜单上或在门户主页中,选择“所有资源”。 此时将显示“所有资源”窗格。

  3. 选择名称以“ProductFunction”开头的函数应用。 此时会显示“函数应用”窗格,其中的“概述”选项卡处于选中状态

    Screenshot of menu selections to open ProductDetails function.

  4. 从函数应用的函数列表中,选择“ProductDetails”。 显示“ProductDetails 函数”窗格。

  5. 在“产品详细信息”菜单中,在“开发人员”下选择“代码 + 测试”。 此时将显示 ProductDetails 函数的“代码 + 测试”窗格,其中显示了 function.json 文件的内容。

    Screenshot of the ProductDetails Code and Test pane, with Test/Run selected in the command bar.

  6. 在命令栏上,选择“测试/运行”。 此时将显示“输入/输出”窗格,用于测试 HTTP 请求。

  7. 在“输入”选项卡中,在“HTTP 方法”字段下拉列表中选择“GET”。

  8. 在“查询”下,选择“添加参数”

  9. 在“名称”字段中输入“id”,在“值”字段中输入“3”,然后选择“运行”。

    Screenshot of the input pane for Test + Run, with the input parameter for the HTTP GET method highlighted.

  10. 此时会显示一个用于连接请求的日志窗格。 “输出”选项卡显示数据库中第 3 项的 HTTP 响应代码 (200 OK) 和内容。

    Screenshot of the output of a pane for Test + Run with response results of running the GET method.

    另外,还可以通过输入 ID 值 1 和 2 来测试函数。

  11. 选择“关闭”以关闭“代码 + 测试”的“输入”“输出”选项卡。

  12. 在 ProductDetails“代码 + 测试”窗格的命令栏上,选择“获取函数 URL”。 请注意,URL 子域是函数应用的名称,后跟 azurewebsites.net 域名。

备注

可以使用此 URL 在浏览器中测试函数。 URL 需要输入;追加查询字符串 &id=1 以请求有关产品集合中第一项的详细信息。

使用 Azure API 管理将函数应用作为 API 公开

部署并测试函数应用后,让我们使用 Azure API 管理将它导出为 API,以便可以从其他应用和服务调用它。

  1. 在“资源”菜单中,选择“所有资源”。 此时将显示“所有资源”窗格。

  2. 按“类型”对资源列表进行排序。 请注意,你有一个 OrderFunction 应用和一个 ProductFunction 应用。

  3. 选择 ProductFunction 函数应用。

  4. 在“函数应用”菜单中,滚动到“API”类别,然后选择“API 管理”。 此时将显示 ProductFunction 函数应用的“API 管理”窗格。

    Screenshot showing menu selection to open the API Management app service.

  5. 在“API 管理”字段下,选择“新建”。 此时会显示“安装 API Management 网关”窗格。

    Screenshot showing settings for an API Management service.

  6. 为每个设置输入以下值。

    设置
    订阅 Concierge 订阅
    资源组 [沙盒资源组名称]
    区域 选择支持消耗计划的位置:(US) 美国西部、美国中北部、西欧、北欧、东南亚、澳大利亚东部
    资源名称 OnlineStore
    组织名称 OnlineStore
    管理员电子邮件 输入电子邮件地址。
    定价层 消耗(99.95% SLA)
  7. 选择“下一步:监视”,并清除“Application Insights”选项。

  8. 选择“查看 + 创建” 。 验证完成后,选择“创建”以创建链接的 API Management 实例。 等待几分钟,以便完成导出。

  9. 部署 API Management 实例后,选择“链接 API”。

    Screenshot of API Management highlighting the Link API button.

    此时将显示“导入 Azure Functions”API 管理服务窗格,其中突出显示了 ProductDetails 函数。

    Screenshot showing the Import Azure Functions API Management service pane.

  10. 选择“选择”以继续操作。 此时将显示“从函数应用创建”对话框。

    Screenshot showing the Create from Function app dialog box.

  11. 将“API URL 后缀”值更改为“products”,然后选择“创建”。 Azure 为“ProductDetails”函数创建 API。 此时将显示函数应用的“API 管理”窗格的“设计”选项卡。

本练习表明你可以只从 Azure 函数应用服务定义 API。

测试 OnlineStore 产品终结点

现在,你已在创建的 API 管理实例中有了一个 ProductDetails API。 让我们使用 Azure 中的 API 管理工具测试该 API。

  1. 在函数应用的“API 管理”窗格中,选择“测试”选项卡。适用于 API 的可用操作将显示在左列中。

  2. 选择“GET ProductDetails”。 随即将显示“ProductDetails 控制台”窗格。

  3. 在“查询参数”下,选择“添加参数”。

    Screenshot showing ProductDetails Console with query parameter values highlighted for the GET HTTP request.

  4. 在“名称”字段中输入“id”,在“值”字段中输入“1”,然后选择“发送”以生成 GET 请求。

    控制台的“HTTP 响应”部分有两个选项卡:消息和跟踪。 “消息”选项卡填充了 HTTP 响应。 在响应结束时,产品详细信息以 JSON 格式显示。 向上滚动到“HTTP 请求”部分,并注意该请求的格式。 请求已发送到 azure-api.net 域中的目标。 此位置不同于托管函数应用的 azurewebsites.net 域。 可以通过其他查询参数(例如 id = 2 或 id = 3)来测试此 API。

    Screenshot showing the **Http request** and **HTTP response** message.