我正在尝试为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(...);
}
}
我是否需要使用此处描述的第二种方法?事件:param('body')是否从SNS消息中获取JSON数据?
答案 0 :(得分: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
。
您可以多次解码主体,也可以将已解码的消息作为事件参数引发显式事件,并包含消息的类型,以便您可以编写明确处理不同类型的规则。