Skip to main content

创建 HTTP 任务

在执行规划的过程中,您可以创建一个任务以将 HTTP 请求发送到第三方应用程序端点。例如,当前面的任务成功执行时,您可以将包含该任务信息的 HTTP 消息发送到指定的端点。

  • HTTP 任务 Alteryx Analytics Cloud (AAC) 与另一个应用程序之间的请求。这些请求通过 HTTP 传送,并且可以由接收应用程序进行解释以执行操作。

    注意

    您的接收应用程序可能要求您将平台的主机和端口号或 IP 地址列入白名单。请参阅您的应用程序的文档。

  • HTTP 任务是可用于规划的任务类型之一。如需了解详情,请参阅 规划视图页面

限制

  • 不能使用自定义安全证书。

  • 基于 HTTP 的请求具有 30 秒的超时限制。

先决条件

对接收应用程序的要求

要将 HTTP 请求发送到目标应用程序,必须对应用程序进行配置以接收请求:

  • 必须启用来自应用程序域外部的请求。

    注意

    您的接收应用程序可能要求您将平台的主机和端口号或 IP 地址列入白名单。请参阅您的应用程序的文档。

  • 您必须获取要向其发送 HTTP 请求的端点的 URL。

  • 您必须获取任何必须随每个 HTTP 请求插入的 HTTP 标头。

  • 如果必须对请求进行签名,则需要进行额外的配置。详情如下。

创建任务

  1. 将 HTTP 任务从左侧窗格拖放到规划画布。

  2. 在右侧面板中,选择 HTTP 任务 。此时将显示 HTTP 任务面板。

PlanViewPage-ViewForHTTPTask.png

图:HTTP 任务

配置任务

  1. 设置所需的参数。如需详细了解参数,请参阅 HTTP 任务在规划中的视图

  2. 您可以在请求的标头值和请求正文中指定规划元数据信息。如需了解详情,请参阅 有关规划元数据的参考文献

  3. 要测试连接,请单击 测试 。此时将显示一条成功消息。

    提示

    状态代码 200 表示测试成功。

    提示

    您可以使用 GET 方法进行测试。GET 请求不会更改目标平台上的任何数据,但可能允许您在请求正文中指定元素。

  4. 要添加任务,请单击 保存

重命名任务

要重命名任务,请在右侧面板中单击 更多菜单 > 编辑

提示

良好的命名可能包括目标平台端点和方法,以及规划中任务的目的。

删除任务

要删除任务,请单击 更多菜单 > 删除 。确认您要删除任务。

警告

此步骤无法撤消。

有关规划元数据的参考文献

在其他任务的消息中,您可以参考有关规划、规划任务及规划执行的元数据。如需了解详情,请参阅 有关规划元数据的参考wen'xian

示例

Slack 频道消息

提示

Slack 任务现已成为受支持的产品功能。如需了解详情,请参阅 创建 Slack 任务

您可以创建 HTTP 任务,将短信传递到您选择的 Slack 频道。

先决条件

设置 Slack 安装以接收 HTTP 消息:

  1. 如果需要,请创建 Slack 频道以接收您的消息。

  2. 创建应用程序。

  3. 为您的应用程序激活传入的 HTTP 消息。

  4. 指定用于接收传入消息的频道。

  5. 从 cURL 语句中复制传入 HTTP 请求的 URL。

定义 HTTP 任务

参数

描述

名称

此名称仅显示在 AAC 中。

方法

选择 POST 方法。

URL

粘贴您从 Slack 复制的 URL。

标头信息

从 Slack cURL 命令复制内容标头:

key: Content-Type
value: application/json

正文

{"text":"Your job has completed."}
验证
  1. 单击 测试 以验证此任务是否有效。

  2. 运行作业并检查 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 任务信息

您可以引用已发生的 HTTP 任务的信息:

{"text":"{{$http_qg.name}} returned {{$http_qg.statusCode}}."} 

如需了解详情,请参阅 有关规划元数据的参考文献

将元数据输入提供给云函数

此示例演示如何使用 HTTP 任务将规划元数据传递到 AWS Lambda 函数。类似的方法可用于 Google Cloud Functions 函数。

在这种情况下,流任务执行的 rowCount 值通过 HTTP 任务传递到 AWS Lambda 函数。

一般步骤:

  1. 定义您的规划。

  2. 流任务:运行流以生成 Lambda 函数所需的输出。

  3. HTTP 任务:生成 HTTP 请求,其正文包含对 rowCount 元数据变量的参考文献。请求正文:

    {
     "rowCount": "{{$flow_7p['My Flow Name'].output['My output name'].rowCount}}"
    }
  4. 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)
      }
  5. 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

步骤 1 - 提取时间戳和签名

拆分 X-Webhook-Signature 标头:

  1. 使用 , 字符作为分隔符来拆分值。

  2. 使用 = 字符拆分每个部分。

  3. 提取时间戳和签名的值。从上述示例中:

    1. 时间戳: 1568818215724

    2. 签名: 55fa71b2e391cd3ccba8413fb51ad16984a38edb3cccfe81f381c4b8197ee07a

步骤 2 - 创建预期签名

在接收应用程序中,您可以重新计算签名,以验证请求是否通过平台发送。

  1. 将时间戳、点字符 . 以及请求正文(POST/PUT/PATCH 方法)或 URL(GET/DELETE 方法)串联起来。

  2. 假设上述示例是 POST 请求的签名,而请求正文是 test 。串联的值如下所示:

    1568818215724.test
  3. 您现在可以在接收应用程序中计算 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');
步骤 3 - 比较签名

应该将您的代码返回的值与作为签名包含在 X-Webhook-Signature 标头中的值进行比较:

  • 如果这些值不匹配,则拒绝该请求。

  • 如果这些值匹配,则计算当前时间戳与标头中的时间戳之间的差值。如果差值超出允许的限制,则拒绝该请求。

  • 否则,在您的应用程序中正常处理该请求。