接收application/x-www-form-urlencoded时API Gateway报415错误
解决AWS API Gateway + Twilio Webhook的415 Unsupported Media Type错误
核心问题定位
Twilio发送的是application/x-www-form-urlencoded格式请求,而API Gateway默认仅接受application/json,映射配置错误会直接触发415错误或请求解析失败。
分步修复方案
1. 修正API Gateway请求方法的基础配置
- 进入API Gateway控制台,找到目标API和对应的POST方法
- 在Method Request中:
- 打开HTTP Request Headers,添加
Content-Type作为可选头(若开启请求验证,需设为必填) - 若启用了Request Validator,确保其规则包含对
Content-Type头的验证
- 打开HTTP Request Headers,添加
2. 配置Integration Request的映射模板
- 进入Integration Request,找到Mapping Templates:
- 点击Add mapping template,输入
application/x-www-form-urlencoded并确认 - 替换原有模板内容为以下代码,将表单参数转为Lambda可识别的JSON结构:
{ "From": "$input.params('From')", "To": "$input.params('To')", "Body": "$input.params('Body')" } - 确认Content Handling设置为Convert to text (if needed),避免使用Passthrough模式
- 点击Add mapping template,输入
3. 配置Method Response的响应头
- 进入Method Response,在HTTP Response Headers中添加
Content-Type - 将其默认值设为
application/xml(Twilio要求接收XML格式的回复)
4. 调整Lambda函数的响应格式
确保Lambda返回符合Twilio要求的XML响应,示例代码:
def lambda_handler(event, context): # 从映射后的event中获取Twilio传递的参数 from_number = event['From'] incoming_body = event['Body'] # 构建Twilio需要的XML回复 xml_response = f"""<Response> <Message>已收到你的消息:{incoming_body}</Message> </Response>""" return { 'statusCode': 200, 'headers': {'Content-Type': 'application/xml'}, 'body': xml_response }
5. 重新部署API并验证
- 在API Gateway控制台点击Deploy API,选择对应的部署阶段
- 用curl或Postman测试:
- 请求方法:POST
- 请求URL:API的部署阶段URL(不要用测试控制台的临时URL)
- 请求头:
Content-Type: application/x-www-form-urlencoded - 请求体:
From=+123456789&To=+987654321&Body=Test - 返回200状态码和正确XML即为配置正常
额外排查点
- 查看CloudWatch日志,API Gateway的日志会记录请求头、映射过程的具体错误信息
- 确认Twilio的Webhook URL指向的是API Gateway的正式部署URL,而非测试链接
- 检查API Gateway的阶段设置,确保映射模板已应用到当前部署的阶段
内容的提问来源于stack exchange,提问作者tosUser
相关产品推荐
相关产品推荐

