AWS Lambda无法接收Content-Type头?Zappa部署Flask至API Gateway问题
我之前在部署Flask应用到Lambda+API Gateway的时候也碰到过一模一样的问题!其他头都能正常拿到,唯独Content-Type要么不见要么不对,折腾了好一阵才解决,给你几个可行的方向:
1. 检查Zappa配置文件
首先确保你的zappa_settings.json里配置了正确的Lambda Proxy集成参数,默认Zappa应该会处理,但有时候遗漏的话会导致头映射异常:
{ "dev": { "app_function": "app.app", "aws_region": "us-east-1", "lambda_event_source": "api_gateway", "apigateway_enabled": true, "proxy": true } }
重点是proxy: true和lambda_event_source: "api_gateway"这两个配置,它们确保Zappa用Lambda Proxy模式和API Gateway对接,正确传递请求头。
2. 在Flask中用正确的方式获取Content-Type
别死磕request.headers.get('Content-Type'),试试Flask提供的request.content_type属性!这个值是从WSGI环境的CONTENT_TYPE变量直接来的,Zappa在转换Lambda事件到WSGI环境时,会把Content-Type映射到这个变量里,比从headers里拿更可靠。比如:
from flask import Flask, request app = Flask(__name__) @app.route('/your-endpoint', methods=['POST']) def your_view(): # 优先用这个 content_type = request.content_type print(f"Content-Type: {content_type}") # 也可以同时打印headers看看差异 print(f"Headers: {dict(request.headers)}") return {"message": "Success"}
3. 检查API Gateway的映射模板(如果手动修改过)
如果你手动调整过API Gateway的集成设置,可能不小心覆盖了默认的请求头映射。默认情况下,Lambda Proxy集成会把所有请求头(除了少数保留头)放到Lambda事件的headers字段里,但如果自定义了映射模板,可能会漏掉Content-Type。如果是这种情况,把映射模板改回默认的$input.json('$')就行,或者确保模板里包含headers字段的完整映射。
4. 启用二进制支持(针对特定Content-Type)
如果你的请求是application/x-www-form-urlencoded或者其他二进制类型,可能需要在Zappa配置里启用二进制支持,否则API Gateway会自动解析内容,导致Content-Type头被处理:
"binary_support": true, "binary_content_types": ["application/x-www-form-urlencoded", "application/json"]
添加这个配置后重新部署,应该能解决头丢失的问题。
5. 更新Zappa到最新版本
旧版本的Zappa确实存在过请求头映射的bug,尤其是Content-Type这类特殊头。执行pip install --upgrade zappa更新到最新版,很多时候就能直接解决问题。
内容的提问来源于stack exchange,提问作者ffleandro

