将带有正文的请求发送到AWS Lambda

时间:2019-01-10 12:11:54

标签: python amazon-web-services http aws-lambda postman

我上传了一个AWS Lambda函数,其中lambda_handler如下所示:

import json
def lambda_handler(event, context):

    print(event)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!'),
        'event': event
    }

问题1:返回event

当我使用Lambda管理控制台对其进行测试时,我可以创建一个带有参数的测试事件,该参数也返回完全相同的格式,并且一切正常:

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

但是,当我使用Postman时,我得到的却完全是其他东西,这又回到了我身上:

{
    "message": "Internal server error"
}

我怀疑是因为event看起来更像是

{'resource': '/hello', 'path': '/hello', 'httpMethod': 'GET', 'headers': {'Accept': '*/*', ... etc

问题2:在正文中添加json参数会产生错误

当我尝试在Postman中添加body> raw> JSON(application / JSON)上面的键时,我得到了错误:

ERROR: The request could not be satisfied

问题

我有两个问题:

  • 如何在事件中传递参数并使用事件或上下文在AWS lambda中捕获参数?
  • 如何正确返回事件?

2 个答案:

答案 0 :(得分:3)

假设您已在AWS API Gateway中将Lambda设置为代理集成。如果您要附加查询字符串参数而没有任何正文,则您的方法类型应为GET。

您将在Lambda中收到请求/GET your-path/?myKey1=value1&myKey2=value2的事件应为:

{
    "resource": "",
    "path": "/your-path",
    "httpMethod": "GET",
    "headers": {
    },
    "queryStringParameters": {
      "myKey1": "value1",
      "myKey2": "value2"
    },
    "pathParameters": {
    },        
    "body": "{}"
  }

您可以在queryStringParameters属性中访问查询字符串参数。

如果您使用Postman发送请求并附加正文,则Lambda集成类型应为POST / PUT。您在Postman请求正文中添加的数据将在event["body"]中可用。

最后一件事情是,如果您直接在控制台中测试Lambda,则当您将其放入正文中时会收到事件。您将需要根据集成方法类型格式化事件。如果是POST / PUT,则:

{
 "body": {
   "someValue": {..}
 }
}

如果是GET,则:

{
 "queryStringParameters": {
    "myKey1": "value1",
    "myKey2": "value2"
  }
}

答案 1 :(得分:0)

在@Althar Khan的帮助下解决了这个问题。

显然,AWS Lambda的API网关仅接受某些属性:

...
return {
    "statusCode": 200,
    "headers": {
        "my_header": "my_value"
    },
    "body": JSON.stringify(responseBody),
    "isBase64Encoded": false
};

在此响应中,有四个字段:statusCode,标头,正文和isBase64Encoded。

在此示例中,函数的响应采用API网关期望的格式。有关更多信息,请参见Output Format of a Lambda Function for Proxy Integration