使用自定义轮询触发器
基本上,轮询触发器是一个事件,该事件定期调用服务来查找新数据。 轮询触发器与 Webhook 的不同之处在于,轮询触发器会启动一个事件来确定新数据是否可用,而 Webhook 则响应服务对新数据的推送。 当流确定新数据可用后,即可使用该数据执行操作。 本教程演示如何使用轮询触发器主动检索新数据。
先决条件
- Power Automate 订阅。
- 构建流和自定义连接器的基本体验。
了解轮询触发器如何获取新数据
轮询触发器首先设置状态,然后在某个时间间隔内定期检查更新。 然后,该触发器请求自上次状态更新以来的所有新数据。 此外,触发器还会维护请求之间的状态上下文。
以下示例概述了轮询触发器如何获取新数据。
- 流运行时在触发器上对连接器中的 API 进行初始调用。
- 然后,连接器会调用后端服务。
- 然后,后端服务将所有当前数据返回到连接器。
- 连接器反过来返回一条“202 已接受”消息、一个重试间隔,以及一个包含当前状态的位置标头。 重试间隔以秒为单位。 第一次调用始终用于建立数据的初始状态。
- 在重试间隔超时后,流运行时使用位置标头和当前状态(在此示例中为 1)对连接器进行另一次调用。
- 由于此状态现在为 1,因此连接器现在知道调用适当的 API 来进行适当的筛选,以便返回正确的数据集。 在此示例中,连接器将其转换为筛选的查询,该查询显示创建日期大于特定时间戳。
- 在此示例中,自创建日期以后没有新数据,因此会将空值集发送回连接器。
- 然后,连接器返回一条“202 已接受”消息、一个重试间隔,以及一个其中的状态尚未更改的位置标头。
- 在重试间隔再次超时后,流运行时使用相同的位置标头和状态对连接器进行另一次调用。
- 连接器再次使用创建日期进行适当的筛选。
- 这一次,新数据自创建日期后变得可用,因此后端会将所有新数据的值返回到连接器。
- 然后,连接器返回“200 正常”消息、重试间隔、带有新状态值的位置,以及包含在创建日期之后变得可用的所有新数据的值数组。 此时,流会启动。
从 UI 创建轮询触发器
本节演示如何在 Power Automate UI 中创建轮询触发器。 在此过程中,我们将从示例 TripPin 服务着手。 TripPin 服务是非常简单的 REST API,其中包含人员及其完成的行程的列表。
若要使用 TripPin 服务,首先需要动态创建服务所需的 URL。 在浏览器的地址栏中输入 https://services.odata.org/TripPinRESTierService。 这会返回本演示所需的元数据。 复制元数据并将其保存到文件供以后使用。
若要设置 TripPin 服务并创建轮询触发器,请执行以下操作:
在 Power Automate 中,选择数据 > 自定义连接器选项卡。
在自定义连接器窗格中,选择新建自定义连接器,然后选择从空白创建。
在“创建自定义连接器”对话框中,输入自定义连接器的名称(在此示例中,可以使用轮询测试),然后选择继续。
在常规页上,指定说明和主机。 在此示例中,我们将使用已在 TripPin 元数据中作为主机返回的 services.odata.org URL。
参数 Value 说明 "TripPin 是一个示例旅游网站。" 主机 "services.odata.org" 在安全性页上,选择不进行身份验证作为身份验证类型。
在定义页上,选择 + 新建触发器,然后填写触发器的说明。 在此示例中,我们将创建一个在将新行程添加到人员的行程时触发的触发器。
参数 Value 摘要 "添加新行程时出现的触发器" 说明 "添加新行程时出现的触发器" 操作 ID "OnNewTrip" 可见性 “无”(有关详细信息,请参见下面的列表) 触发器类型 "轮询" 流中操作和参数的可见性属性具有以下选项:
- 无:在流中正常显示
- 高级:在其他菜单下隐藏
- 内部:向用户隐藏
- 重要:始终先向用户显示
请求区域基于对操作的 HTTP 请求显示信息。 选择从示例导入。
在从示例导入窗格中,我们将定义轮询触发器的请求。 选择 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、路径和查询参数。
在请求区域中,选择 $filter 查询参数,然后选择编辑以显示参数对话框。
在
$filter
的参数对话框中,将可见性选项设置为内部。 此参数仅由连接器在内部使用,这会阻止用户进行任何更改。 有关可见性设置的详细信息,请参阅 x-ms-visibility OpenAPI 扩展。选择返回可返回到请求区域。
在请求区域中,选择 $orderby 查询参数,然后选择编辑以显示参数对话框。
在
$orderby
的参数对话框中,将是否必需? 选项设置为是,将可见性选项设置为内部。 同样,这些设置会阻止用户对此参数进行任何更改。此外,请在默认值框中输入 TripId desc 作为值。 这些设置会确保按相反的顺序给出结果。
选择返回可返回到前一区域。
响应区域基于对操作的 HTTP 响应显示信息。 选择添加默认响应。
定义轮询触发器的响应,然后选择导入。 使用下面提供的示例作为响应正文,这会自动为响应生成架构。
{ "@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 中的 <服务号>。
在触发器配置区域中,选择用于监视 TripPin 中状态更改的参数。 在此示例中,要输入的参数为
$filter
。在此示例中,请在指定要传递给所选查询参数的值中使用以下表达式:
TripId gt @{triggerBody().value[0].TripId}
此表达式用于获取触发器运行时出现的最新结果。 在此处使用的表达式中,当
TripId
大于表达式的其余部分返回的值时,触发器就会运行。 如果TripId
不大于表达式的其余部分返回的值,则不会出现触发器。在选择包含触发器数据的集合选项中,选择 @triggerBody().value。 这是包含后端服务返回的触发器数据的数组。
在向导顶部,选择创建连接器。
使用轮询触发器
完成所有配置后,即可在流中使用轮询触发器。 在本部分,我们将创建一个流,用于在每次记录特定人员的新行程时,轮询后端服务的更改。
在 flow.microsoft.com 中的页面左侧,选择创建。
在从空白开始下,选择即时流。
在生成即时流对话框中,选择跳过按钮。
在搜索框中,输入添加新行程时出现的触发器。
在列表中选择该项目以将其用作触发器。
在人员流框中,输入 russellwhyte 作为要检查其行程的人员,然后选择 + 新建步骤。
在选择操作对话框中,选择内置选项卡,然后选择日期/时间。
从日期/时间中选择当前时间。
选择保存以保存新流。
验证和故障排除
若要验证是否已正确完成所有设置,请选择我的流,然后选择添加新行程时出现的触发器 -> 当前时间流以查看运行历史记录。 由于流尚未运行,因此目前在历史记录中不应显示任何内容。
若要测试流,需打开 Postman 应用程序,将新数据添加到 TripPin 中。
在 Postman 中,选择启动板选项卡旁边的 + 图标。
在无标题请求中,从左侧下拉框中选择 POST,然后在 输入请求 URL 框中输入以下地址:
https://services.odata.org/TripPinRESTierService/(S(<Service number))/People('russellwhyte')/Trips
备注
请务必使用元数据中的实际数字,而不是 URL 中的 <服务号>。
在 POST 请求下,选择正文选项卡,然后选择 raw。 在 raw 右侧的下拉列表中,选择 JSON。
在文本框中,输入以下文本:
{ "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" }
选择发送,将 POST 消息发送到 TripPin 站点。
响应返回时的状态应为
201 Created
。
现在,当你打开我的流并选择添加新行程时出现的触发器 -> 当前时间流时,就会在运行历史记录中看到触发器已出现。
备注
如果在 Postman 中为同一人运行另一个 POST 请求,则需更改 JSON 正文中的 TripId 值。 否则,会出现“409 冲突”错误。
如果一切配置正确,每当 TripPin 中添加新行程时,您现在都会在 Microsoft Power Automate 中收到通知。
另请参见
提供反馈
我们非常感谢大家提出有关连接器平台问题或新功能想法的反馈。 要提供反馈,请转到提交问题或获取连接器帮助,然后选择反馈类型。