2

我正在尝试为 Amazon SNS 设置 Webhook。SNS 将向 webhook 发送一个 JSON 对象。根据 KRL 文档,我可以使用 event:param('name') 获取事件参数。这适用于表单编码数据,但 JSON 呢?

我给 postbin.org 打了电话,这是 postbin 报告的:

body {
  "Message": "You have ...",
  "MessageId": "958....",
  "Signature": "vo3v5f....",
  ...
}

这是我想用 KRL 写的:

rule sns_webhook {
  select when webhook sometopic Type "SubscriptionConfirmation"
  pre {
    topic_arn = event:param("TopicARN");
    signature = event:param("Signature");
    message = event:param("Message");
    subscribe_url = event:param("SubscribeURL");
  }
  if valid_signature(signature) then {
    confirm_subscription(subscribe_url);
  }
}

这可能适用于 HTTP 表单编码数据,但对于 JSON,我预计将需要以下内容:

rule sns_json {
  select when webhook sometopic
  pre {
    body = event:param('body').decode();
    msg_type = body.pick("Type");
    signature = body.pick("Signature");
    ...
  }
  if msg_type eq "SubscriptionConfirmation" && valid(signature) then
  {
    confirm_subscription(...);
  }
}

我需要使用这里描述的第二种方法吗?event:param('body') 会从 SNS 消息中获取 JSON 数据吗?

4

1 回答 1

2

您的第二个代码块非常接近。在这里,重写为使用正确的事件:param()

rule sns_json {
  select when webhook sometopic
  pre {
    body = event:param('request_body').decode();
    msg_type = body.pick("Type");
    signature = body.pick("Signature");
    ...
  }
  if msg_type eq "SubscriptionConfirmation" && valid(signature) then
  {
    confirm_subscription(...);
  }
}

如果你先有这个规则,我会记得last在后fired奏块中添加一个。

除了多次解码正文之外,您还可以使用已解码的消息作为事件参数引发显式事件,并包含消息的类型,以便您可以编写显式处理不同类型的规则。

于 2011-06-03T22:12:18.753 回答