如何在Bash脚本中通过Curl向AWS SQS发送JSON格式消息?
解决Bash中用Curl向AWS SQS发送JSON消息的问题
这个问题我太熟悉了!你遇到的核心问题是JSON里的特殊字符(大括号{}、双引号"、空格等)在URL中属于需要编码的保留字符,直接拼在URL里会被HTTP服务器或者SQS解析错误,导致消息投递失败。下面给你几个实用的解决方案:
方案1:用curl的--data-urlencode自动编码(推荐)
这个方法最省心,--data-urlencode会自动帮你把所有特殊字符转换成URL编码格式,不用手动处理转义。命令示例:
curl "https://sqs.eu-west-1.amazonaws.com/[MY_QUEUE_NAME]?Action=SendMessage" \ --data-urlencode "MessageBody={\"machine\": \"SOME_MACHINE\", \"user\": \"SOME_USER\"}"
注意:因为我们在Bash的双引号字符串里,JSON内部的双引号需要用反斜杠\转义,避免被Bash解析成字符串结束符。
方案2:读取本地JSON文件发送(适合复杂JSON)
如果你的JSON内容很长或者有多层嵌套,手动转义双引号太麻烦,可以先把JSON写到文件里,再让curl读取并编码:
# 第一步:把JSON内容写入文件(这里直接用echo生成,你也可以手动编辑) echo '{"machine": "SOME_MACHINE", "user": "SOME_USER"}' > my_message.json # 第二步:用curl发送,@符号表示读取文件内容作为参数值 curl "https://sqs.eu-west-1.amazonaws.com/[MY_QUEUE_NAME]?Action=SendMessage" \ --data-urlencode "MessageBody@my_message.json"
这个方法完全不用处理转义问题,非常适合复杂场景。
方案3:手动URL编码JSON内容(不推荐,仅作了解)
如果你一定要把参数放在URL里,可以先把JSON内容手动转换成URL编码格式。比如你的原始JSON:
{"machine": "SOME_MACHINE", "user": "SOME_USER"}
编码后会变成:
%7B%22machine%22%3A%20%22SOME_MACHINE%22%2C%20%22user%22%3A%20%22SOME_USER%22%7D
然后拼到URL里:
curl "https://sqs.eu-west-1.amazonaws.com/[MY_QUEUE_NAME]?Action=SendMessage&MessageBody=%7B%22machine%22%3A%20%22SOME_MACHINE%22%2C%20%22user%22%3A%20%22SOME_USER%22%7D"
不过这种方法容易出错,尤其是JSON内容复杂的时候,不建议使用。
额外小贴士
AWS SQS的SendMessage API也支持POST请求,把参数放在请求体里会比拼在URL里更清晰,比如:
curl -X POST "https://sqs.eu-west-1.amazonaws.com/[MY_QUEUE_NAME]" \ --data "Action=SendMessage" \ --data-urlencode "MessageBody={\"machine\": \"SOME_MACHINE\", \"user\": \"SOME_USER\"}"
这样参数分开写,可读性更强,也更不容易出错。
内容的提问来源于stack exchange,提问作者Viacheslav
相关产品推荐
相关产品推荐

