有效负载无效JSON

时间:2015-04-01 22:45:45

标签: json bash shell curl

我使用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"

我会收到错误

  

Payload无效JSONsent

然而,如果我只是通过输出

来硬件分配变量
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看到的,它与消息的构建方式有关。

2 个答案:

答案 0 :(得分:5)

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

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

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"

答案 1 :(得分:4)

这是我在bash脚本中的作用:

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

请注意内部引号已转义,但外部引号不是。

仅供参考,补充说:

set -x 
在bash脚本开头的

将显示正在执行的实际命令,并节省大量的猜测。