使用自定义轮询触发器

基本上,轮询触发器是一个事件,该事件定期调用服务来查找新数据。 轮询触发器与 Webhook 的不同之处在于,轮询触发器会启动一个事件来确定新数据是否可用,而 Webhook 则响应服务对新数据的推送。 当流确定新数据可用后,即可使用该数据执行操作。 本教程演示如何使用轮询触发器主动检索新数据。

先决条件

了解轮询触发器如何获取新数据

轮询触发器首先设置状态,然后在某个时间间隔内定期检查更新。 然后,该触发器请求自上次状态更新以来的所有新数据。 此外,触发器还会维护请求之间的状态上下文。

以下示例概述了轮询触发器如何获取新数据。

轮询触发器如何获取数据

  1. 流运行时在触发器上对连接器中的 API 进行初始调用。
  2. 然后,连接器会调用后端服务。
  3. 然后,后端服务将所有当前数据返回到连接器。
  4. 连接器反过来返回一条“202 已接受”消息、一个重试间隔,以及一个包含当前状态的位置标头。 重试间隔以秒为单位。 第一次调用始终用于建立数据的初始状态。
  5. 在重试间隔超时后,流运行时使用位置标头和当前状态(在此示例中为 1)对连接器进行另一次调用。
  6. 由于此状态现在为 1,因此连接器现在知道调用适当的 API 来进行适当的筛选,以便返回正确的数据集。 在此示例中,连接器将其转换为筛选的查询,该查询显示创建日期大于特定时间戳。
  7. 在此示例中,自创建日期以后没有新数据,因此会将空值集发送回连接器。
  8. 然后,连接器返回一条“202 已接受”消息、一个重试间隔,以及一个其中的状态尚未更改的位置标头。
  9. 在重试间隔再次超时后,流运行时使用相同的位置标头和状态对连接器进行另一次调用。
  10. 连接器再次使用创建日期进行适当的筛选。
  11. 这一次,新数据自创建日期后变得可用,因此后端会将所有新数据的值返回到连接器。
  12. 然后,连接器返回“200 正常”消息、重试间隔、带有新状态值的位置,以及包含在创建日期之后变得可用的所有新数据的值数组。 此时,流会启动。

从 UI 创建轮询触发器

本节演示如何在 Power Automate UI 中创建轮询触发器。 在此过程中,我们将从示例 TripPin 服务着手。 TripPin 服务是非常简单的 REST API,其中包含人员及其完成的行程的列表。

若要使用 TripPin 服务,首先需要动态创建服务所需的 URL。 在浏览器的地址栏中输入 https://services.odata.org/TripPinRESTierService。 这会返回本演示所需的元数据。 复制元数据并将其保存到文件供以后使用。

若要设置 TripPin 服务并创建轮询触发器,请执行以下操作:

  1. 在 Power Automate 中,选择数据 > 自定义连接器选项卡。

  2. 自定义连接器窗格中,选择新建自定义连接器,然后选择从空白创建

  3. 在“创建自定义连接器”对话框中,输入自定义连接器的名称(在此示例中,可以使用轮询测试),然后选择继续

  4. 常规页上,指定说明和主机。 在此示例中,我们将使用已在 TripPin 元数据中作为主机返回的 services.odata.org URL。

    参数 Value
    说明 "TripPin 是一个示例旅游网站。"
    主机 "services.odata.org"

    添加说明和主机

  5. 安全性页上,选择不进行身份验证作为身份验证类型。

    轮询身份验证

  6. 定义页上,选择 + 新建触发器,然后填写触发器的说明。 在此示例中,我们将创建一个在将新行程添加到人员的行程时触发的触发器。

    创建新触发器

    参数 Value
    摘要 "添加新行程时出现的触发器"
    说明 "添加新行程时出现的触发器"
    操作 ID "OnNewTrip"
    可见性 “无”(有关详细信息,请参见下面的列表)
    触发器类型 "轮询"

    流中操作和参数的可见性属性具有以下选项:

    • :在流中正常显示
    • 高级:在其他菜单下隐藏
    • 内部:向用户隐藏
    • 重要:始终先向用户显示
  7. 请求区域基于对操作的 HTTP 请求显示信息。 选择从示例导入

    定义页 - 从示例导入

  8. 从示例导入窗格中,我们将定义轮询触发器的请求。 选择 GET 作为谓词。 从你在动态创建服务所需的 URL 时收到的元数据中,将 URL 地址复制到从示例导入窗格中的 URL。 在地址后添加 /People('{Person}')/Trips?$filter=TripId gt 0&$orderby=TripId desc。 例如:

    https://services.odata.org/TripPinRESTierService/(S(<service number>))/People('{Person}')/Trips?$filter=TripId gt 0&$orderby=TripId desc

    备注

    请务必使用元数据中的实际数字,而不是 URL 中的 <服务号>。

    在此 URL 示例中,你将为单个人员创建请求,{Person} 是用户可以在流中指定的运行时变量。 接下来,指定你要获取用户输入的特定人员的行程。

    不过,不需获取所有行程,只需获取自上次轮询后的新行程。 $filter=TripId gt 0 表达式通过返回任何行程的 TripId 来获取新行程,前提是该 TripId 大于之前轮询的 TripId。 此处使用的数字 0 会在每次出现轮询触发器时自动更新。

    此外,$orderby=TripId desc 表达式指示以降序方式返回作为 TripId 的数据的顺序。 触发器要求数据按降序返回。 也就是说,后端服务返回的结果必须在触发器参数中进行反向排序,这样最新参数(如本示例中的 TripId)就是数据数组中返回的第一个值。

    “从示例导入”菜单

    选择导入按钮以导入示例数据。 请求区域现在显示谓词、URL、路径和查询参数。

  9. 在请求区域中,选择 $filter 查询参数,然后选择编辑以显示参数对话框。

    编辑 filter 参数

  10. $filter参数对话框中,将可见性选项设置为内部。 此参数仅由连接器在内部使用,这会阻止用户进行任何更改。 有关可见性设置的详细信息,请参阅 x-ms-visibility OpenAPI 扩展

    选择返回可返回到请求区域。

    编辑 filter 参数

  11. 在请求区域中,选择 $orderby 查询参数,然后选择编辑以显示参数对话框。

  12. $orderby参数对话框中,将是否必需? 选项设置为,将可见性选项设置为内部。 同样,这些设置会阻止用户对此参数进行任何更改。

    此外,请在默认值框中输入 TripId desc 作为值。 这些设置会确保按相反的顺序给出结果。

    选择返回可返回到前一区域。

    编辑 orderby 参数

  13. 响应区域基于对操作的 HTTP 响应显示信息。 选择添加默认响应

    添加默认轮询响应

  14. 定义轮询触发器的响应,然后选择导入。 使用下面提供的示例作为响应正文,这会自动为响应生成架构。

    添加轮询响应正文

    
    {
        "@odata.context":"https://services.odata.org/TripPinRESTierService/(S(<service number>))/$metadata#Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Trip)",
        "value":[
            {
                "TripId":2,
                "ShareId":"9ce142c3-5fd6-4a71-848e-220ebf1e9f3",
                "Name":"Honeymoon",
                "Budget":2650,
                "Description":"Happy honeymoon trip",
                "Tags":[
                    "Travel",
                    "honeymoon"
                ],
                "StartsAt":"2014-02-01T00:00:00Z",
                "EndsAt":"2014-02-04T00:00:00Z"
            },
            {
                "TripId":1,
                "ShareId":"f94e9116-8bdd-4dac-ab61-08438d0d9a71",
                "Name":"Trip in Beijing",
                "Budget":2000,
                "Description":"Trip from Shanghai to Beijing",
                "Tags":[
                    "Travel",
                    "Beijing"
                ],
                "StartsAt":"2014-02-01T00:00:00Z",
                "EndsAt":"2014-02-04T00:00:00Z"
            }
        ]
    }   
    

    备注

    请务必使用元数据中的实际数字,而不是 URL 中的 <服务号>。

  15. 触发器配置区域中,选择用于监视 TripPin 中状态更改的参数。 在此示例中,要输入的参数为 $filter

    在此示例中,请在指定要传递给所选查询参数的值中使用以下表达式:

    TripId gt @{triggerBody().value[0].TripId}

    此表达式用于获取触发器运行时出现的最新结果。 在此处使用的表达式中,当 TripId 大于表达式的其余部分返回的值时,触发器就会运行。 如果 TripId 不大于表达式的其余部分返回的值,则不会出现触发器。

    选择包含触发器数据的集合选项中,选择 @triggerBody().value。 这是包含后端服务返回的触发器数据的数组。

    轮询触发器配置

  16. 在向导顶部,选择创建连接器

使用轮询触发器

完成所有配置后,即可在流中使用轮询触发器。 在本部分,我们将创建一个流,用于在每次记录特定人员的新行程时,轮询后端服务的更改。

  1. flow.microsoft.com 中的页面左侧,选择创建

  2. 从空白开始下,选择即时流

  3. 生成即时流对话框中,选择跳过按钮。

  4. 在搜索框中,输入添加新行程时出现的触发器

    在搜索框中显示搜索文本的屏幕截图。

    在列表中选择该项目以将其用作触发器。

  5. 人员流框中,输入 russellwhyte 作为要检查其行程的人员,然后选择 + 新建步骤

    显示“人员”框和“新建步骤”按钮的屏幕截图。

  6. 选择操作对话框中,选择内置选项卡,然后选择日期/时间

    显示“选择操作”对话的屏幕截图。

  7. 日期/时间中选择当前时间

    显示“当前时间”按钮的屏幕截图。

  8. 选择保存以保存新流。

验证和故障排除

若要验证是否已正确完成所有设置,请选择我的流,然后选择添加新行程时出现的触发器 -> 当前时间流以查看运行历史记录。 由于流尚未运行,因此目前在历史记录中不应显示任何内容。

若要测试流,需打开 Postman 应用程序,将新数据添加到 TripPin 中。

  1. 在 Postman 中,选择启动板选项卡旁边的 + 图标。

  2. 在无标题请求中,从左侧下拉框中选择 POST,然后在 输入请求 URL 框中输入以下地址:

    https://services.odata.org/TripPinRESTierService/(S(<Service number))/People('russellwhyte')/Trips

    备注

    请务必使用元数据中的实际数字,而不是 URL 中的 <服务号>。

  3. 在 POST 请求下,选择正文选项卡,然后选择 raw。 在 raw 右侧的下拉列表中,选择 JSON

  4. 在文本框中,输入以下文本:

    {
         "TripId": 190,
         "ShareId": "9d9b2fa0-efbf-490e-a5e3-bac8f7d47354",
         "Name": "Trip in US",
         "Budget": 5000,
         "Description": "Trip from San Francisco to New York City",
         "Tags": [
             "business",
             "New York meeting"
         ],
         "StartsAt": "2014-01-01T00:00:00Z",
         "EndsAt": "2014-01-04T00:00:00Z"
    }
    
  5. 选择发送,将 POST 消息发送到 TripPin 站点。

    发送 POST 消息

    响应返回时的状态应为 201 Created

现在,当你打开我的流并选择添加新行程时出现的触发器 -> 当前时间流时,就会在运行历史记录中看到触发器已出现。

触发器已出现

备注

如果在 Postman 中为同一人运行另一个 POST 请求,则需更改 JSON 正文中的 TripId 值。 否则,会出现“409 冲突”错误。

如果一切配置正确,每当 TripPin 中添加新行程时,您现在都会在 Microsoft Power Automate 中收到通知。

另请参见

提供反馈

我们非常感谢大家提出有关连接器平台问题或新功能想法的反馈。 要提供反馈,请转到提交问题或获取连接器帮助,然后选择反馈类型。