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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:25