API Gateway无法向SQS发送完整请求体的解决方法
解决API Gateway无法向SQS发送完整请求体的问题
问题根源
你当前的API Gateway集成使用application/x-www-form-urlencoded格式向SQS发送请求,而请求体中包含&这类表单参数分隔符(比如Stripe事件里的cancel_url字段带有&success=false),会被HTTP表单解析器误判为新参数的起始位置,导致MessageBody被截断在第一个&出现的地方。
修复方案
修改API Gateway集成的请求模板,对请求体进行URL编码,避免特殊字符被误解析:
调整Terraform中的aws_api_gateway_integration配置
将原有的request_templates部分替换为:
request_templates = { "application/json" = "Action=SendMessage&MessageBody=$util.urlEncode($input.json('$'))" }
$util.urlEncode()会自动转义JSON中的特殊字符(如&、=、空格等),确保整个请求体作为单一参数传递给SQS。
消费SQS消息时的注意事项
当你从SQS中读取消息时,需要对MessageBody进行URL解码,才能还原为原始的JSON格式。比如在Lambda中可以用decodeURIComponent()(JavaScript)或urllib.parse.unquote()(Python)完成解码。
额外验证点
- 确认API Gateway的
passthrough_behavior保持为NEVER,确保请求模板被正确使用。 - 检查SQS队列的消息大小限制(默认是256KB),确保你的Stripe事件大小未超过限制。
内容的提问来源于stack exchange,提问作者nicktsan
相关产品推荐
相关产品推荐

