AWS API Gateway作为SQS代理时请求内加号被转为空格问题咨询
API Gateway转发JSON到SQS时加号被替换为空格问题解答
问题成因
+字符在application/x-www-form-urlencoded格式规范中是空格的标准转义表示。- 该问题由API Gateway与SQS服务集成时的编码逻辑不匹配导致:你当前的配置中直接将未编码的JSON请求体映射到SQS的
MessageBody参数,而SQS的SendMessage接口会默认对接收的参数执行一次URL解码,JSON中的+会被解码为空格后存入队列。 - 通过AWS控制台发送消息时,控制台会自动对输入内容做标准URL编码后再调用SQS接口,因此加号可以正常保留。
所需额外配置
你只需要修改API Gateway对应路由的集成请求映射模板即可解决问题,步骤如下:
- 进入对应API的集成请求配置页,找到「映射模板」配置模块
- 新增Content-Type为
application/json的映射模板,模板内容填写如下:
Action=SendMessage&MessageBody=$util.urlEncode($input.body)
- 保存模板配置后,重新部署API Gateway到对应阶段即可生效。
修改配置后你可以用原测试curl命令验证:
curl --location --request POST 'https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/yyyy' \ --header 'Content-Type: application/json' \ --data-raw '{"data": "25+2"}'
此时SQS队列收到的消息中将正常保留+字符,消费端读取也不会出现符号丢失问题。
内容的提问来源于stack exchange,提问作者Neias
相关产品推荐
相关产品推荐

