Apache Velocity模板语言(VTL):处理冒号



我的设置是一个AWS Lambda函数,它从API网关接收POST数据。当我向我的Twilio号码发送WhatsApp消息时,webhook是从Twilio发送的。

有人能向我解释一下这里发生了什么吗?有没有办法避免冒号被转换为%3A%2B。或者这是我必须在更深层次上与Pyhton做的事情?

AWS API网关,集成请求-映射模板

#set($httpPost = $input.path('$').split("&"))
{
#foreach( $kvPair in $httpPost )
#set($kvTokenised = $kvPair.split("="))
#if( $kvTokenised.size() > 1 )
"$kvTokenised[0]" : "$kvTokenised[1]"#if( $foreach.hasNext ),#end
#else
"$kvTokenised[0]" : ""#if( $foreach.hasNext ),#end
#end
#end
}

AWS Lambda功能

def lambda_handler(event, context):
print("Received event: " + str(event))
print("Received Body: " + str(event.get('Body')))
return 200
# return '<?xml version="1.0" encoding="UTF-8"?>'
#       '<Response><Message>Hello world! -Lambda</Message></Response>'

在我的控制台中打印。whatsapp%3A%2B491573599343应为whatsapp:491573599343

Received event: {'SmsMessageSid': 'SM851aa11c912d3775d7941143d8b935f9', 'NumMedia': '0', 'SmsSid': 'SM851aa11c912d3775d7941143d8b935f9', 'SmsStatus': 'received', 'Body': 'Hi', 'To': 'whatsapp%3A%2B4915735992273', 'NumSegments': '1', 'MessageSid': 'SM851aa11c912d3775d7941143d8b935f9', 'AccountSid': 'AC358aa1d18557365a9e1f5e2ffcbcebe0', 'From': 'whatsapp%3A%2B49160343202', 'ApiVersion': '2010-04-01'}

更新:

#set($httpPost = $input.path('$').split("&"))
{
#foreach( $kvPair in $httpPost )
#set($kvTokenised = $kvPair.split("="))
#if( $kvTokenised.size() > 1 )
"$kvTokenised[0]" : "$esc.unurl($kvTokenised[1])"#if( $foreach.hasNext ),#end
#else
"$kvTokenised[0]" : ""#if( $foreach.hasNext ),#end
#end
#end
}

您所要求的基本上是对url编码的字符进行unscaping。你可以通过两种方式实现这一点:

  1. 使用EscapeTool取消映射模板本身中的参数(https://velocity.apache.org/tools/devel/apidocs/org/apache/velocity/tools/generic/EscapeTool.html)速度。所以您的代码现在看起来是这样的:

"$kvTokenised[0]" : "$esc.unurl($kvTokenised[1]"

  1. 在AWS Lambda函数中这样处理它(python(:

urllib.parse.unquote(str(event))

实际上,这与VTL无关,而是与URL解码有关。

在Python 3+中,您可以使用urlib.parse包提供的unquote((函数对任何字符串进行URL解码。默认情况下,unquote((函数使用UTF-8编码。

因此,在您的情况下,您会在lambda函数中这样做:

>>> import urllib.parse
>>> encodedStr = 'whatsapp%3A%2B491573599343'
>>> urllib.parse.unquote(encodedStr)
'whatsapp:+491573599343'

你可以在这里找到一篇好文章:https://www.urldecoder.io/python/

最新更新