Curl读取JSON文件编码为URL参数发送Amazon SQS消息
Curl - 将文件编码为URL查询参数
你之前尝试的命令无效,核心是没有正确使用--data-urlencode的参数规则,下面两种方案都可以直接实现需求,自动读取JSON文件、完成URL编码后发起请求。
方案1:POST表单传参(最简便,推荐)
不需要手动拼接URL,curl自动处理文件读取和编码,直接执行即可:
curl --request POST \ --data-urlencode "Action=SendMessage" \ --data-urlencode "MessageBody@input.json" \ http://localhost:9324/queue/price-import
这个写法完全符合SQS接口的参数要求,和你最开始硬编码参数的请求效果完全一致,不管是本地模拟的SQS服务还是真实Amazon SQS都能正常识别。
方案2:参数拼接到URL查询串(完全匹配你最初的命令结构)
如果你一定要把MessageBody参数放在URL的查询串部分,可以先借助curl内置的编码能力处理文件内容,再拼接到URL上:
# 读取input.json内容并完成URL编码 ENCODED_MSG=$(curl -s -G --data-urlencode "MessageBody@input.json" "" 2>/dev/null | cut -d'?' -f2 | cut -d'=' -f2-) # 拼接完整URL发起请求 curl --request POST \ "http://localhost:9324/queue/price-import?Action=SendMessage&MessageBody=${ENCODED_MSG}"
之前尝试无效的原因
--data-urlencode的参数必须遵循固定格式,你之前的写法有几个典型错误:
- 直接把完整URL跟在
--data-urlencode后面时,curl会把整段URL当成普通待编码内容,不会识别其中的参数结构和@文件读取语法 - 参数名写错:SQS要求的消息体参数名是
MessageBody,你之前写的SendBody是无效参数 - 参数格式缺失:读取文件作为参数值的正确格式是
参数名@文件路径,不能漏写参数名、也不能把参数名和@符号的顺序写反
注意事项
- 执行命令时如果不在JSON文件所在目录,把
input.json换成文件的完整绝对路径即可 - 如果JSON文件体积较大,优先用方案1的表单传参方式,避免URL长度超过服务端限制导致请求失败
内容的提问来源于stack exchange,提问作者mikolaj semeniuk
相关产品推荐
相关产品推荐

