使用AWS API Gateway时,如何避免在每个url参数周围加上引号?

时间:2019-03-27 17:25:34

标签: amazon-web-services aws-lambda aws-api-gateway

我正在尝试利用AWS的API网关触发lambda函数,该函数将文件从源存储桶复制到目标存储桶。我希望API调用的形式为

https://some/api/url/my_lambda_function?key1=joe.mp4&key2=video-files&key3=edited-video-files

我设置了lambda函数。我附加了API网关并配置了API网关。问题是当我设置集成映射时。

当我运行https://some/api/url/my_lambda_function?key1="joe.mp4"&key2="video-files"&key3="edited-video-files"时,一切正常。但是,如果我在不带引号的情况下运行它,则会出现错误。例如,如果我删除key3参数周围的引号,则错误为

{"message": "Could not parse request body into json: Unrecognized token \'edited\': was expecting (\'true\', \'false\' or \'null\')\n at [Source: (byte[])\"{\n \"key1\": \"joe.mp4\",\n \"key2\": \"video-files\",\n \"key3\": edited-video-files\n\n}\n\"; line: 4, column: 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'

2 个答案:

答案 0 :(得分:1)

如果我在映射模板键/值对中的值两边加上引号,那似乎行得通:

    "key1": "$input.params('key1')",
    "key2": "$input.params('key2')",
    "key3": "$input.params('key3')"

}```

答案 1 :(得分:0)

如果要使用键/值对(例如key1 =“ joe.mp4”)传递url参数,则必须使用引号来定义该键的字符串值。

但是,您也可以为不需要引号的URL设置映射,而用斜杠(“ /”)as highlighted in this example隔开,但是这些映射不像键/值设置,因为它们必须遵循特定的顺序。

例如,使用键/值设置,您可以执行http://url?key1="value1"&key2="value2"&key3="value3",也可以执行http://url?key3="value3"&key1="value1"&key2="value2",它将得到相同的结果(请注意键的顺序)。但是,如果使用斜杠将静态参数分隔开,则无法执行此操作,所有值都必须以静态顺序http://url/value1/value2/value3

传递