API Gateway对接SQS传MessageAttributes返回400的正确POST传参方式
解决方案
1. 修正POST请求体结构
你当前的请求体存在两个语法/格式错误:一是缺少JSON开头的{,二是MessageAttributes结构不符合SQS参数规范,SQS要求属性名作为键直接放在MessageAttributes下,不需要单独写Name字段。正确的请求体写法如下:
{ "message": "Message", "MessageAttributes": { "Name": { "Type": "String", "Value": "my value" } } }
2. 配置API Gateway到SQS的集成映射模板
你使用的是API Gateway对接AWS SQS服务的非代理集成,必须添加请求映射模板,把客户端传的JSON参数转换为SQS的SendMessage API要求的参数格式,操作步骤如下:
- 进入API Gateway对应资源的集成请求配置页
- 找到映射模板板块,添加请求内容类型为
application/json的模板 - 填入以下Velocity映射模板(支持多MessageAttribute自动映射):
#set($message = $input.path('$.message')) #set($attributes = $input.path('$.MessageAttributes')) Action=SendMessage&MessageBody=$util.urlEncode($message) #set($count = 1) #foreach($attr in $attributes.entrySet()) &MessageAttributes.entry.${count}.Name=$util.urlEncode($attr.key) &MessageAttributes.entry.${count}.Value.DataType=$util.urlEncode($attr.value.Type) &MessageAttributes.entry.${count}.Value.StringValue=$util.urlEncode($attr.value.Value) #set($count = $count + 1) #end
- 保存配置后重新部署API生效
3. 错误排查路径
如果修改后仍然返回400错误,可开启API Gateway的CloudWatch执行日志,查看转发给SQS的请求明文以及SQS返回的具体错误提示,常见剩余问题包括:
- SQS队列的资源策略未给API Gateway的执行角色开放
sqs:SendMessage权限 - 请求体中
MessageAttributes的Type值不合法(仅支持String、Number、Binary三类) - 映射模板配置错误导致参数丢失/格式异常
内容的提问来源于stack exchange,提问作者user17071347
相关产品推荐
相关产品推荐

