如何使用curl 发布包含需要转义字符的json 字符串?

2023-12-26

我有一个 shell 脚本,我一直用它来将内容发布到 hipchat 频道。它工作正常,直到我尝试发送包含需要转义的字符的消息。我像这样运行命令(注意其中额外的反斜杠会导致问题)

/usr/local/bin/hipchatmsg.sh "my great message here \ " red

我的 bash 脚本 (hipchatmsg.sh) 中重要的代码是这样的:

# Make sure message is passed
if [ -z ${1+x} ]; then
    echo "Provide a message to create the new notification"
    exit 1
else
    MESSAGE=$1
fi

// send locally via curl
/usr/bin/curl -H "Content-Type: application/json" \
   -X POST \
   -k \
   -d "{\"color\": \"$COLOR\", \"message_format\": \"text\",  \"message\": \"$MESSAGE\" }" \
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN &

// $server and $room are defined earlier

exit 0

如果我尝试使用任何需要转义的字符运行上面的命令,我将收到如下错误:

{
    "error": {
    "code": 400,
    "message": "The request body cannot be parsed as valid JSON: Invalid \\X escape sequence u'\\\\': line 1 column 125 (char 124)",
    "type": "Bad Request"
    }
}

我在这里发现了类似的东西,最好的建议是尝试使用 --data-urlencode 发送卷曲帖子,所以我尝试这样:

/usr/bin/curl -H "Content-Type: application/json" \
   -X POST  \
   -k \
   -d --data-urlencode "{\"color\": \"$COLOR\", \"message_format\": \"text\",  \"message\": \"$MESSAGE\" }" \
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN &

但这没有效果。

我在这里缺少什么?


最简单的事情就是使用像这样的程序jq https://stedolan.github.io/jq/生成 JSON;它将负责转义需要转义的内容。

jq -n --arg color "$COLOR" \
      --arg message "$MESSAGE" \
   '{color: $color, message_format: "text", message: $message}' |
 /usr/bin/curl -H "Content-Type: application/json" \
   -X POST \
   -k \
   -d@- \
   $SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN &

论据@- to -d tells curl从标准输入读取,该输入由jq通过管道。这--arg选项jq为过滤器提供可用的 JSON 编码字符串,这只是一个 JSON 对象表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用curl 发布包含需要转义字符的json 字符串? 的相关文章

随机推荐