Amazon web services 在使用AWSAPI网关时,如何避免在每个url参数周围加引号?

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”

我试图利用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”&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')”,