AWS API Gateway无Content-Type头时返回Unsupported media type问题求助
问题分析与解决方案
我之前也碰到过一模一样的问题,先给你拆解下核心原因,再一步步说解决办法:
为什么GUI测试正常,外部调用报错?
API Gateway的内置测试控制台其实会自动帮你填充默认请求头,包括Content-Type: application/json,所以你手动不传的时候,控制台偷偷给加上了,自然能正常工作。但Postman、CURL这类外部工具不会做这个自动填充,当请求里没有Content-Type头时,API Gateway会默认把请求识别为application/octet-stream(二进制流类型),而你的集成请求只配置了application/json的处理规则,所以就触发了「unsupported media type」错误。
解决方案
方案1:添加application/octet-stream的映射模板
这是最直接的解决方式,让API Gateway能处理无Content-Type的请求:
- 打开API Gateway控制台,找到你的目标API和对应的方法
- 进入「Integration Request」,拉到「Mapping Templates」部分
- 点击「Add mapping template」,输入
application/octet-stream,然后勾选「Yes, secure this integration」 - 在模板编辑框里输入
$input.json('$'),这个模板会把请求体(不管是什么格式)转换成JSON格式传给Lambda - 保存所有配置,一定要重新部署API(这步很容易忘!)
方案2:设置API的默认媒体类型
如果希望整个API都默认用application/json处理无Content-Type的请求,可以这么做:
- 进入你的API的「Settings」页面(在左侧导航栏最底部)
- 找到「Default Media Type」选项,输入
application/json并保存 - 重新部署API,之后所有没有指定Content-Type的请求都会被默认当作
application/json处理
额外验证:Lambda的兼容性
确保你的Lambda函数能处理空请求体或者非标准格式的输入,比如如果请求没有内容,函数里要避免直接解析JSON导致报错,可以加个判断逻辑:
import json def lambda_handler(event, context): # 处理空请求体的情况 if not event: return { 'statusCode': 200, 'body': json.dumps({'message': 'Empty request handled'}) } # 正常业务逻辑 # ...
测试验证
部署完成后,用CURL测试下:
curl -X POST https://your-api-id.execute-api.your-region.amazonaws.com/your-stage/your-resource
如果能正常返回响应,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Aphro Pfotte
相关产品推荐
相关产品推荐

