【问题标题】:How can i add break line in curl with json data?如何使用 json 数据在 curl 中添加断线?
【发布时间】:2020-10-23 18:19:46
【问题描述】:

我正在使用这个 bash 脚本向我的 rocket.chat 实例发布一条新消息。

#!/usr/bin/env bash
function usage {
    programName=$0
    echo "description: use this program to post messages to Rocket.chat channel"
    echo "usage: $programName [-b \"message body\"] [-u \"rocket.chat url\"]"
    echo "      -b    The message body"
    echo "      -u    The rocket.chat hook url to post to"
    exit 1
}
while getopts ":b:u:h" opt; do
  case ${opt} in
    u) rocketUrl="$OPTARG"
    ;;
    b) msgBody="$OPTARG"
    ;;
    h) usage
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done
if [[ ! "${rocketUrl}" || ! "${msgBody}" ]]; then
    echo "all arguments are required"
    usage
fi
read -d '' payLoad << EOF
{"text": "${msgBody}"}
EOF
echo $payLoad
statusCode=$(curl \
        --write-out %{http_code} \
        --silent \
        --output /dev/null \
        -X POST \
        -H 'Content-type: application/json' \
        --data "${payLoad}" ${rocketUrl})
echo ${statusCode}

一切正常,所以我可以发送这样的新消息

./postToRocket.sh -b "Hello from here" -u $RocketURL

但是当我尝试添加这样的多行消息时

./postToRocket.sh -b "Hello from here\nThis is a new line" -u $RocketURL

它不起作用。我得到以下输出:

{"text": "Hello from heren New Line"}
200

那么我需要改变什么,才能在这些 bash 脚本中使用换行符。有什么想法吗?

【问题讨论】:

  • 这能回答你的问题吗? How to send line break with curl?;查看各种答案,了解有关如何向 curl 提交换行符的一些想法
  • 部分问题是read 在不与-r 一起使用时会破坏反斜杠; 更大的 问题是,即使您没有损坏反斜杠,您的结果仍然不是合法的 JSON,因此不能期望远程服务器接受它。 JSON 文档需要有 \n 序列,而不是换行符。

标签: bash curl rocket.chat


【解决方案1】:

首先,使\n 中的反斜杠消失的原因是缺少read-r 参数。让它read -r -d '' payLoad 将解决这个问题。 但是,这不是一个好的解决方案:它要求您的调用者传递已经转义以包含在 JSON 中的字符串,而不是让他们传递任何/所有可能的字符串。


要使用任意字符串(包括可以包含换行文字、引号、反斜杠或其他必须转义的内容的字符串)生成有效的 JSON,请使用 jq

payLoad=$(jq -n --arg msgBody "$msgBody" '{"text": $msgBody}')

...然后,在这样做之后,修改你的调用约定:

./postToRocket.sh -b $'Hello from here\nThis is a new line' -u "$RocketURL"

【讨论】:

    【解决方案2】:

    我相信这已经在 SO here 中得到了回答

    应该通过添加 $ 符号并使用单引号来工作:

    ./postToRocket.sh -b $'Hello from here\nThis is a new line' -u $RocketURL
    

    【讨论】:

    • 这告诉你如何在文本 bash 字符串中添加换行符,而不是如何从该字符串中生成有效的 JSON。
    猜你喜欢
    • 2018-09-14
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2019-03-14
    • 2012-06-20
    相关资源
    最近更新 更多