如何在AWS Lambda API函数中接收HTTP POST参数并解决CORS错误
问题解决:Lambda的CORS错误与POST参数获取失败
核心问题分析
你遇到的CORS预检错误,根源是OPTIONS请求处理逻辑错误:当浏览器发送OPTIONS预检请求时,你的代码尝试解析event['body'],但OPTIONS请求本身没有请求体,这会直接抛出异常,导致Lambda返回500错误状态码,不符合预检要求的200 OK,从而触发CORS拦截。
同时POST参数获取失败,除了可能的请求格式问题,代码里的字符串语法错误(f'{source['dias']}'单引号嵌套)也会导致执行报错。
修复后的代码
import json def lambda_handler(event, context): # 单独处理OPTIONS预检请求,直接返回CORS头和200状态 if event['httpMethod'] == 'OPTIONS': return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Requested-With', 'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS', }, 'body': json.dumps('') } # 处理POST请求 elif event['httpMethod'] == 'POST': # 增加异常处理,避免body为空或格式错误导致崩溃 try: source = json.loads(event.get('body', '{}')) # 修复字符串语法错误,改用双引号包裹f-string response_body = json.dumps(f"{source.get('dias', '参数未找到')}") except json.JSONDecodeError: response_body = json.dumps('请求体格式错误,需为JSON') return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Requested-With', 'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS', }, 'body': response_body } # 处理其他不允许的请求方法 else: return { 'statusCode': 405, 'headers': { 'Access-Control-Allow-Origin': '*' }, 'body': json.dumps({'message': 'Method not allowed'}) }
关键改动说明
- 分离OPTIONS请求处理:单独返回符合要求的CORS响应,不解析请求体,确保预检请求返回200 OK。
- 增加异常处理:用
event.get('body', '{}')避免body不存在的KeyError,捕获JSON解析错误,防止函数崩溃。 - 修复语法错误:把
f'{source['dias']}'改为f"{source['dias']}",解决单引号嵌套的语法问题。 - 优化非POST/OPTIONS方法响应:返回405(方法不允许)状态码,并带上CORS头,避免额外的CORS问题。
额外注意事项
- 确保客户端Ajax请求的
Content-Type设置为application/json,否则Lambda无法用json.loads解析请求体。 - 如果客户端发送的是表单数据(
application/x-www-form-urlencoded),需要改用urllib.parse.parse_qs(event['body'])来解析参数。
内容的提问来源于stack exchange,提问作者BladeMartin
相关产品推荐
相关产品推荐

