我正在尝试为亚马逊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数据吗?
您的第二个代码块非常接近。在这里,重写为使用正确的事件: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(...);
}
}
如果你先有这个规则,我会记得在fired
后缀块中添加一个last
。
您也可以使用已解码的消息作为事件参数来引发显式事件,并包括消息的类型,这样您就可以编写显式处理不同类型的规则,而不是多次解码正文。