2011-06-03 76 views
2

我正在嘗試爲Amazon SNS設置Webhook。 SNS將發送一個JSON對象給webhook。基於KRL文檔,我可以使用event:param('name')來獲取事件參數。這適用於表單編碼數據,但是JSON呢?KRL webhooks接收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(...); 
    } 
} 

我是否需要使用秒這裏介紹的ond方法?請問event:param('body')從SNS消息中獲取JSON數據?

回答

2

你的第二個代碼塊非常接近。這是,重寫並使用正確的事件:如果你第一次有這種規則參數()

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

除了可以多次解碼主體,還可以將已解碼消息的顯式事件作爲事件參數引發,幷包含消息的類型,以便您可以編寫明確處理不同類型的規則。