Amazon web services 在使用AWSAPI网关时,如何避免在每个url参数周围加引号?
我试图利用AWS的API网关触发一个lambda函数,该函数将文件从源bucket复制到目标bucket。我希望API调用的形式是Amazon web services 在使用AWSAPI网关时,如何避免在每个url参数周围加引号?,amazon-web-services,aws-lambda,aws-api-gateway,Amazon Web Services,Aws Lambda,Aws Api Gateway,我试图利用AWS的API网关触发一个lambda函数,该函数将文件从源bucket复制到目标bucket。我希望API调用的形式是 https://some/api/url/my_lambda_function?key1=joe.mp4&key2=video-files&key3=编辑的视频文件 我设置了lambda函数。我连接API网关并配置API网关。问题是当我设置集成映射时 当我运行https://some/api/url/my_lambda_function?key1=“joe.mp4”
https://some/api/url/my_lambda_function?key1=joe.mp4&key2=video-files&key3=编辑的视频文件
我设置了lambda函数。我连接API网关并配置API网关。问题是当我设置集成映射时
当我运行https://some/api/url/my_lambda_function?key1=“joe.mp4”&key2=“video files”&key3=“edited video files”
一切正常。但是,如果我运行它时没有在参数周围加引号,我会得到一个错误。例如,如果删除key3参数周围的引号,则错误为
{“message”:“无法将请求正文解析为json:无法识别的标记‘编辑’:在[Source:(byte[])\“{\n\“key1\”:“joe.mp4\”,\n\“key2\”:“video files\”,\n\“key3\”:编辑的视频文件\n\n}\n\“第4行,第22列”}
这是我的设置
在API网关->资源->集成请求->映射模板下,我单击该选项(当没有定义模板时)。我使用application/json,我的模板是:
{
"key1": $input.params('key1'),
"key2": $input.params('key2'),
"key3": $input.params('key3')
}
为完整起见,我的Lambda是:
import boto3
def lambda_handler(event, context):
# initialize s3
s3 = boto3.client("s3")
# print event output
print(event)
FILENAME = event['key1']
SOURCE_BUCKET = event['key2']
DEST_BUCKET = event['key3']
# formatted copy string
copy_source = {
'Bucket': SOURCE_BUCKET,
'Key': FILENAME,
}
# copy files
s3.copy_object(Bucket=DEST_BUCKET, Key=FILENAME, CopySource=copy_source)
return 'Thanks for watching'
如果要使用键/值对传递url参数,例如key1=“joe.mp4”,则必须使用引号,因为引号定义了键的字符串值 但是,您也可以为URL设置不需要引号的映射,而是用斜杠(“/”)分隔,但这些映射不如键/值设置灵活,因为它们必须按特定顺序排列
例如,使用键/值设置,您可以执行
http://url?key1=“value1”&key2=“value2”&key3=“value3”
,也可以执行http://url?key3=“value3”&key1=“value1”&key2=“value2”
将产生相同的结果(注意键的顺序)。但是,如果静态参数以斜杠分隔,则无法执行此操作,所有值必须以静态顺序传递,http://url/value1/value2/value3
如果我在映射模板键值对中的值周围加上引号,似乎会起作用:
"key1": "$input.params('key1')",
"key2": "$input.params('key2')",
"key3": "$input.params('key3')"
}```
对的您正在主体映射模板中组装原始JSON,因此必须提供引号。此外,如果由于字符串内容的原因,结果是无效的JSON,则仍然会失败,因此正确的解决方案是“key1”:“$util.escapeJavaScript($input.params('key1')”,