优秀的编程知识分享平台

网站首页 > 技术文章 正文

运维超实用:命令行 curl post有变量的json数据

nanyue 2025-03-14 19:31:51 技术文章 1 ℃

背景:

今天测试钉钉机器人通知的webhookapi的时候遇到一个问题,网上有很多python对应的程序,但是由于python受制于很多模块的安装还有环境的安装,某些对服务器影响更小的情况下可以通过shell curl 命令行的方式实现一样的功能。但是curl 提交json数据的时候如果json的数据中没有变量,可以正常提交,但是如果你含有变量就涉及单引号、双引号的引用,而且如果你的变量值中有空格又会引发其他的问题,这里提供了我测试的三种方法

方法一:

通过双引号单引号 : "'$param'" ,这样对于单一的内容是没有问题的

Bash
curl 'https://xxxx.com/robot/send?access_token=tokenxxx' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text","text": {"content": "'$1'"}}'

优点: 简单高效

缺点:对于$1 的内容是有一些要求,不能有特殊字符比如你传一个base64 a.jpg 的值,或者内容过长也会有问题,如果是POST还好,但是如果是GET那么就会导致很多内容缺失。base64 值中的很多内容会被curl作为主机名去解析


方法二:

这种方法通过EOF 构造json字符串的形式实现数据的构造,避免了双引号、单引号的麻烦

Bash
#!/bin/bash
a=`base64 a.jpg`
b=`md5sum a.jpg | awk '{print $1}'`

generate_data() {
cat <<EOF
{
    "msgtype": "image",
    "image":{
        "base64": "$a",
        "md5": "$b"
    }
}
EOF
}
curl "https://xxx.com/cgi-bin/webhook/send?key=xxxx" -H "Content-Type: application/json" --data $(generate_data)

优点: 可以解决字符串很长的问题,同时兼顾可以使用变量

缺点:如果$a中有回车符就会到知道json格式不对的错误


方法三:(实测最高效,准确的办法)

#!/bin/bash
a=`base64 a.jpg`
b=`md5sum a.jpg | awk '{print $1}'`


curl "https://xxxx.com/cgi-bin/webhook/send?key=dxxxx" -H "Content-Type: application/json"  --data @-  <<EOF
{
    "msgtype": "image",
    "image":{
        "base64": "$a",
        "md5": "$b"
    }
}
EOF

这个方法的意义在于"@-" ,相当于--data @/dev/fd/xxxx ,让程序看起来是处理一个文件。这样 将后续的内容作为一个文件内容传递给curl,让curl去执行

最近发表
标签列表