如何从AWS API向Python Lambda传递变量?
event['bar']的KeyError问题 我来帮你理清这个问题——你遇到的核心是API Gateway传递给Lambda的event结构和你预期的不一样,尤其是POST请求的处理逻辑,咱们一步步来解决:
1. 为什么请求头里的bar拿不到?
你最初用curl把bar放在请求头里,但Lambda的event字典并不会直接把请求头字段平级放在根节点。请求头其实存在event['headers']里,如果你非要从header取的话,得写event['headers']['bar']——但这不是REST API传递业务数据的常规做法,咱们还是应该把数据放在请求体里。
2. POST请求体的正确处理方式
当你用content-type: application/json发送JSON格式的请求体时,API Gateway默认会把请求体以字符串形式存在event['body']里,而不是自动解析成字典。这就是你用event['body']['bar']报错的原因——你在给字符串做字典索引!
解决方法很简单:在Lambda里手动把body字符串解析成JSON对象:
import json def lambda_handler(event, context): # 解析JSON格式的请求体 request_body = json.loads(event['body']) foo = request_body['bar'] print(foo) # 返回标准的API响应格式 return { 'statusCode': 200, 'body': json.dumps('Successfully received bar value!') }
3. 修正你的Python Requests调用代码
你写的代码里有个小错误:用了requests.put,但你的API是处理POST请求的,得改成requests.post。另外,当你用json=data参数时,Requests会自动帮你设置Content-Type: application/json头,所以你可以不用手动写这个头:
import requests url = "https://correctaddress.amazonaws.com/production/test" headers = {'x-api-key': "CORRECTKEY"} data = {'bar': "Hello World"} # 用post方法,而不是put res = requests.post(url, json=data, headers=headers) # 打印响应内容查看结果 print(res.text)
4. 额外补充:API Gateway的event结构简化说明
给你贴一个POST请求下Lambda收到的event简化结构,方便你理解:
{ "resource": "/production/test", "httpMethod": "POST", "headers": { "x-api-key": "CORRECTKEY", "content-type": "application/json", # 其他请求头... }, "body": "{\"bar\": \"Hello World\"}", # 注意这里是JSON字符串,不是字典 "isBase64Encoded": False }
如果想让API Gateway自动帮你把body解析成字典,可以在API Gateway的集成请求里配置映射模板:选择Content-Type为application/json,添加模板$input.json('$'),这样Lambda收到的event['body']就是现成的字典,不用自己再解析了。不过如果只是单个函数的话,手动解析反而更省事。
内容的提问来源于stack exchange,提问作者Tedd Johnson

