You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从AWS API向Python Lambda传递变量?

解决Lambda POST请求中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:11