2015-06-03 49 views
0

我提交的消息在通过他们的API和“消息”变量的内容bash脚本来山魈导致API调用一个错误回来:如何在bash脚本中使用curl来发布JSON变量?

An error occured: {"status":"error","code":-1,"name":"ValidationError","message":"You must specify a key value"} 

的$的内容MESSAGE_BODY变量是:

Trigger: Network traffic high on 'server' 
Trigger status: PROBLEM 
Trigger severity: Average 
Trigger URL: 

Item values: 

1. Network traffic inbound (server:net.if.in[eth0,bytes]): 3.54 MBytes 
2. Network traffic outbound (server:net.if.out[eth0,bytes]): 77.26 KBytes 
3. *UNKNOWN* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN* 

Original event ID: 84 

我不知道什么是字符串的一部分是把它扔了,但似乎什么原因造成的JSON时提交山魈的API是无效的。

如果我将上述消息更改为诸如“Testing 123”之类的简单消息,则会成功提交消息。

,做的POST代码如下:

#!/bin/bash 
... 
message_body = `cat message.txt` 
msg='{ "async": false, "key": "'$key'", "message": { "from_email": "'$from_email'", "from_name": "'$from_name'", "headers": { "Reply-To": "'$reply_to'" }, "auto_html": false, "return_path_domain": null, "subject": "'$2'", "text": "'$message_body'", "to": [ { "email": "'$1'", "type": "to" } ] } }' 
results=$(curl -A 'Mandrill-Curl/1.0' -d "$msg" 'https://mandrillapp.com/api/1.0/messages/send.json' -s 2>&1); 
echo "$results" 

我能做些什么,以确保$message_body变量并随时准备所要提交有效的JSON?

+2

更改为'message_body = $(cat message.txt)',或者如果您想让您的同事惊讶,'m_b = $( shellter

+1

如果你想**绝对肯定** message_body是有效的JSON,请使用特定于JSON的工具(如'jq')来生成它;这将涵盖所有的角落案例 - 文字引号&c。除非'jq'被告知使用非JSON输出格式,否则它实际上不能发出无效的JSON内容。 –

回答

3

我怀疑问题是缺乏周围的变量引用的

msg='{ "async": false, "key": "'$key'", "message": { "from_email": "'$from_email'", "from_name": "'$from_name'", "headers": { "Reply-To": "'$reply_to'" }, "auto_html": false, "return_path_domain": null, "subject": "'$2'", "text": "'$message_body'", "to": [ { "email": "'$1'", "type": "to" } ] } }' 
# ..............................^^^^ no quotes around var ...........^^^^^^^^^^^...................^^^^^^^^^^...............................^^^^^^^^^...................................................................^^..............^^^^^^^^^^^^^.........................^^ 

试试这个:在每个变量的任何双引号被转义。

escape_quotes() { echo "${1//\"/\\\"}"; } 
msg=$(
    printf '{ "async": false, "key": "%s", "message": { "from_email": "%s", "from_name": "%s", "headers": { "Reply-To": "%s" }, "auto_html": false, "return_path_domain": null, "subject": "%s", "text": "%s", "to": [ { "email": "%s", "type": "to" } ] } }' \ 
     "$(escape_quotes "$key")"   \ 
     "$(escape_quotes "$from_email")" \ 
     "$(escape_quotes "$from_name")" \ 
     "$(escape_quotes "$reply_to")"  \ 
     "$(escape_quotes "$2")"   \ 
     "$(escape_quotes "$message_body")" \ 
     "$(escape_quotes "$1")" 
) 
相关问题