【问题标题】:How can I post a json string with curl that has characters that need escaping?如何使用 curl 发布包含需要转义的字符的 json 字符串?
【发布时间】:2016-07-16 11:23:30
【问题描述】:

我有一个 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 &

但这没有任何效果。

我在这里错过了什么?

【问题讨论】:

  • URL 编码和 JSON 编码是两个不同的东西;不过,curl 不知道 JSON。

标签: bash shell curl


【解决方案1】:

最简单的做法是使用类似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 对象表达式。

【讨论】:

  • 感谢您的解释。你是救生员! JQ很棒
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多