【问题标题】:payload is not valid JSON有效负载不是有效的 JSON
【发布时间】:2015-04-01 22:45:44
【问题描述】:

我正在使用 curl 将 JSON 发送到 API 端点。然而,在 bash 链的某个地方,它变得一团糟。

关于使用curl 进行编码有什么特别需要了解的吗?

如果我这样构造有效载荷:

 PAYLOAD='payload={"channel": "github", "username": "webhookbot", "icon_emoji": ":ghost:", "text": "'
 PAYLOAD+=$1
 PAYLOAD+=' " }'

 echo $PAYLOAD
 curl -X POST --data-urlencode "$PAYLOAD" $SLACKPOSTURL
 echo "sent"

我会返回一个错误

负载不是有效的 JSON 发送

但是,如果我只是硬连线来为输出分配一个变量

PAYLOAD='payload={"channel": "github", "username": "webhookbot", "icon_emoji": ":ghost:", "text": "LAST_COMMIT Merge pull request #558 from dcsan/boteditor Boteditor " }'

那么它会顺利通过的。

简单的赋值与连接字符串有什么不同吗?在控制台中,输出看起来相同。

FWIW 一些消息通过但内容如下:

LAST_COMMIT 合并来自 dcsan/boteditor Boteditor 的拉取请求 #558

只有在硬编码后才会通过。所以它不是另一端 afaican 看到的,它与消息的构建方式有关。

【问题讨论】:

    标签: json bash shell curl


    【解决方案1】:

    我猜你想将值连接到你的变量中。但是+= 不是这样做的。

    要连接变量中的字符串,您需要说:

    PAYLOAD="$PAYLOAD $1"
    

    所有这些都将类似于以下内容。注意需要使用" 以便扩展变量$PAYLOAD 并使用\" 来存储文字双引号:

    PAYLOAD='payload={"channel": "github", "username": "webhookbot", "icon_emoji": ":ghost:", "text": "'
    PAYLOAD="$PAYLOAD $1 \" }"
    
    echo "$PAYLOAD"
    curl -X POST --data-urlencode "$PAYLOAD" $SLACKPOSTURL
    echo "sent"
    

    【讨论】:

    • JSON 的其余部分需要 " 在 tho 中,所以这将是一个巨大的转义字符串
    • 您可以使用'":在需要扩展变量时使用";否则使用'。编辑:事实上,你每次都需要",因为我们要扩展$PAYLOAD。但是,对于您给定的情况,它只需要一个转义的"
    • 好的,我尝试使用 PAYLOAD="$PAYLOAD $1" PAYLOAD="$PAYLOAD \""\}"" 但仍然是同样的错误。我想也许另一端不喜欢斜杠。
    • 我认为你是在逃避。 PAYLOAD="$PAYLOAD \" }" 应该没问题。
    【解决方案2】:

    这是我从 bash 脚本中得到的效果:

    curl -X POST --data-urlencode "payload={\"text\": \"$2\"}" https://hooks.slack.com/services/$KEY
    

    注意内引号被转义,但外引号没有。

    仅供参考,添加:

    set -x 
    

    在 bash 脚本的开头会显示正在执行的实际命令,并节省大量猜测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多