创建 HTTP 任务
在执行规划的过程中,您可以创建一个任务以将 HTTP 请求发送到第三方应用程序端点。例如,当前面的任务成功执行时,您可以将包含该任务信息的 HTTP 消息发送到指定的端点。
HTTP 任务 是 Alteryx Analytics Cloud (AAC) 与另一个应用程序之间的请求。这些请求通过 HTTP 传送,并且可以由接收应用程序进行解释以执行操作。
注意
您的接收应用程序可能要求您将平台的主机和端口号或 IP 地址列入白名单。请参阅您的应用程序的文档。
HTTP 任务是可用于规划的任务类型之一。如需了解详情,请参阅 规划视图页面 。
限制
不能使用自定义安全证书。
基于 HTTP 的请求具有 30 秒的超时限制。
先决条件
对接收应用程序的要求
要将 HTTP 请求发送到目标应用程序,必须对应用程序进行配置以接收请求:
必须启用来自应用程序域外部的请求。
注意
您的接收应用程序可能要求您将平台的主机和端口号或 IP 地址列入白名单。请参阅您的应用程序的文档。
您必须获取要向其发送 HTTP 请求的端点的 URL。
您必须获取任何必须随每个 HTTP 请求插入的 HTTP 标头。
如果必须对请求进行签名,则需要进行额外的配置。详情如下。
创建任务
将 HTTP 任务从左侧窗格拖放到规划画布。
在右侧面板中,选择 HTTP 任务 。此时将显示 HTTP 任务面板。
![PlanViewPage-ViewForHTTPTask.png](../../../image/uuid-15da5eb3-9778-039f-e93c-a20cbf2cf52d.png)
图:HTTP 任务
配置任务
设置所需的参数。如需详细了解参数,请参阅 HTTP 任务在规划中的视图 。
您可以在请求的标头值和请求正文中指定规划元数据信息。如需了解详情,请参阅 有关规划元数据的参考文献 。
要测试连接,请单击 测试 。此时将显示一条成功消息。
提示
状态代码
200
表示测试成功。提示
您可以使用 GET 方法进行测试。GET 请求不会更改目标平台上的任何数据,但可能允许您在请求正文中指定元素。
要添加任务,请单击 保存 。
重命名任务
要重命名任务,请在右侧面板中单击 更多菜单 > 编辑 。
提示
良好的命名可能包括目标平台端点和方法,以及规划中任务的目的。
删除任务
要删除任务,请单击 更多菜单 > 删除 。确认您要删除任务。
警告
此步骤无法撤消。
有关规划元数据的参考文献
在其他任务的消息中,您可以参考有关规划、规划任务及规划执行的元数据。如需了解详情,请参阅 有关规划元数据的参考wen'xian 。
示例
Slack 频道消息
提示
Slack 任务现已成为受支持的产品功能。如需了解详情,请参阅 创建 Slack 任务 。
您可以创建 HTTP 任务,将短信传递到您选择的 Slack 频道。
设置 Slack 安装以接收 HTTP 消息:
如果需要,请创建 Slack 频道以接收您的消息。
创建应用程序。
为您的应用程序激活传入的 HTTP 消息。
指定用于接收传入消息的频道。
从 cURL 语句中复制传入 HTTP 请求的 URL。
参数 | 描述 |
---|---|
名称 | 此名称仅显示在 AAC 中。 |
方法 | 选择
|
URL | 粘贴您从 Slack 复制的 URL。 |
标头信息 | 从 Slack cURL 命令复制内容标头: key: Content-Type value: application/json |
正文 | {"text":"Your job has completed."} |
单击 测试 以验证此任务是否有效。
运行作业并检查 Slack 频道中是否有消息。
有关规划元数据的示例
您可以引用规划定义和当前规划运行作业的元数据信息作为 HTTP 任务请求的一部分。
注释:
您只能为 HTTP 任务开始前已经在规划运行作业中发生的任务插入元数据引用。
使用两个字母的代码引用当前运行作业中的每个任务。示例:
{{$http_xx.name}}
使用以下语法构建有关规划元数据的引用。在相应的文本框中,输入以下值之一:
提示
首先输入
$
,这将提供对每种元数据引用类型的元数据引用菜单树的访问权限。最后的语法如上所述。
规划:
规划定义或当前规划运行作业的元数据信息:
{{$plan
以下请求正文包含对规划名称、规划运行标识符和刚刚执行的流的引用:
{"text":"Plan: {{$plan.name}} RunId: {{$plan.runId}} Flow: {{$flow_7p.name}} Success."}
以下请求正文包含使用时间戳的规划执行信息:
{"text":"Plan: {{$plan.name}} RunId: {{$plan.runId}} - plan start: {{$plan.startTime}} Running time: {{$plan.duration}} Times: - last task start: {{$flow_7p.startTime}} - last task end: {{$flow_7p.endTime}} "}
您可以引用已发生的 HTTP 任务的信息:
{"text":"{{$http_qg.name}} returned {{$http_qg.statusCode}}."}
如需了解详情,请参阅 有关规划元数据的参考文献 。
将元数据输入提供给云函数
此示例演示如何使用 HTTP 任务将规划元数据传递到 AWS Lambda 函数。类似的方法可用于 Google Cloud Functions 函数。
在这种情况下,流任务执行的
rowCount
值通过 HTTP 任务传递到 AWS Lambda 函数。
一般步骤:
定义您的规划。
流任务:运行流以生成 Lambda 函数所需的输出。
HTTP 任务:生成 HTTP 请求,其正文包含对 rowCount 元数据变量的参考文献。请求正文:
{ "rowCount": "{{$flow_7p['My Flow Name'].output['My output name'].rowCount}}" }
AWS Lambda 函数: 以下是 Lambda 的伪代码:
import json def lambda_handler(event, context): httpTaskBody = json.loads(event["body"]) rowCount = httpTaskBody["rowCount"] return { 'statusCode': 200, 'body': json.dumps(rowCount) }
Google Cloud Functions 函数: 以下是 Google Cloud Functions 函数的伪代码:
def get_row_count(request): request_json = request.get_json() if request_json and 'rowCount' in request_json: rowCount = request_json['rowCount'] return rowCount return 'No rowCount attribute provided'
验证签名
警告
实现签名验证可能需要开发人员技能,具体取决于目标应用程序。
或者,您可以配置平台来对 HTTP 请求进行签名。签名的请求保证请求是从平台发送,而不是从第三方发送。
下面,您可以查看签名的创建方式,以便配置接收应用程序以正确处理签名及其相关请求。
签名标头
通过在 HTTP 请求中插入
X-Webhook-Signature
标头对 HTTP 请求进行签名。这些签名采用以下格式:
X-Webhook-Signature: t=<timestamp>,sha256=<signature>
其中:
<timestamp>
- 发送签名时的时间戳。值以 UNIX 时间表示。<signature>
- SHA256 签名。该平台使用基于哈希的消息身份验证代码 (HMAC) 和 SHA-256 生成此签名。
下面提供了有关这些值的更多信息。
示例:
X-Webhook-Signature: t=1568818215724,sha256=55fa71b2e391cd3ccba8413fb51ad16984a38edb3cccfe81f381c4b8197ee07a
检查应用程序工具
根据应用程序的不同,您可能需要完成以下一组任务来验证任务签名:
注意
您可能需要将应用程序中的平台列入白名单。如需了解详情,请参阅应用程序文档。
您可能需要为您的应用程序创建一些自定义编码。您可以查看以下内容,详细了解如何执行此操作,包括 JavaScript 示例。
处理签名的请求
时间戳值 (
t=<timestamp>
) 出现在标头值的开头,以防止重放攻击(即攻击者可以截获有效负载及其签名并重新传输)。
为了避免此类攻击,时间戳包含在签名标头中,并且还作为签名有效负载的一部分嵌入。
由于时间戳是已签名有效负载的一部分,因此攻击者无法在不使签名失效的情况下更改时间戳值。
如果签名有效但时间戳太旧,您可以选择拒绝该请求。
例如,如果您收到一个时间戳与一小时前的日期相对应的请求,可能应该拒绝该请求。
如需详细了解重放攻击,请参阅 https://en.wikipedia.org/wiki/Replay_attack 。
任务签名将以下内容纳入其哈希值:
密钥(在上面输入)
时间戳值
请求数据:
(POST/PUT/PATCH) - 请求的正文
(GET/DELETE) - 请求的 URL
拆分
X-Webhook-Signature
标头:
使用 , 字符作为分隔符来拆分值。
使用 = 字符拆分每个部分。
提取时间戳和签名的值。从上述示例中:
时间戳:
1568818215724
签名:
55fa71b2e391cd3ccba8413fb51ad16984a38edb3cccfe81f381c4b8197ee07a
在接收应用程序中,您可以重新计算签名,以验证请求是否通过平台发送。
将时间戳、点字符 . 以及请求正文(POST/PUT/PATCH 方法)或 URL(GET/DELETE 方法)串联起来。
假设上述示例是
POST
请求的签名,而请求正文是test
。串联的值如下所示:1568818215724.test
您现在可以在接收应用程序中计算 HMAC 身份验证代码。在以下 JavaScript 示例中,密钥值为
mySecret
:const crypto = require('crypto'); const message = '1568818215724.test'; // as defined above const hmac = crypto.createHmac('sha256', 'mySecret'); hmac.update(message) const expectedSignature = hmac.digest('hex');
应该将您的代码返回的值与作为签名包含在
X-Webhook-Signature
标头中的值进行比较:
如果这些值不匹配,则拒绝该请求。
如果这些值匹配,则计算当前时间戳与标头中的时间戳之间的差值。如果差值超出允许的限制,则拒绝该请求。
否则,在您的应用程序中正常处理该请求。