如何发布一个带有curl的json字符串,其中包含需要转义的字符



我有一个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发送curl帖子,所以我试着这样做:

/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的程序来生成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 &

参数@--d告诉curl从标准输入读取,该标准输入通过管道从jq提供。jq--arg选项为过滤器提供了JSON编码的字符串,过滤器只是一个JSON对象表达式。

相关内容

  • 没有找到相关文章

最新更新