我想发送一个 json 请求并在发布数据中嵌入一个变量。
我做了一些研究,然后想出了变量周围的单引号。
#!/bin/bash
FILENAME="/media/file.avi"
curl -i -X POST -H "Content-Type: application/json" —d '{"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file":"'$FILENAME'"}}}' http://192.167.0.13/jsonrpc
不幸的是我收到一些错误:
curl: (6) Couldn't resolve host '—d'
curl: (3) [globbing] nested braces not supported at pos 54
HTTP/1.1 200 OK
Content-Length: 76
Content-Type: application/json
Date: Wed, 29 Jan 2014 19:16:56 GMT
{"error":{"code":-32700,"message":"Parse error."},"id":null,"jsonrpc":"2.0"}
显然大括号和 http 答案存在一些问题,该命令无法执行。我这里的代码有什么问题吗?
谢谢!
这是我的curl
版本:
curl 7.30.0 (mips-unknown-linux-gnu) libcurl/7.30.0 OpenSSL/0.9.8y
Protocols: file ftp ftps http https imap imaps pop3 pop3s rtsp smtp smtps tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL
更新:使用更简单的
request_body=$(cat <<EOF
{
"jsonrpc": "2.0",
"method": "Player.Open",
"params": {
"item": {
"file": "$FILENAME"
}
}
}
EOF
)
而不是我下面解释的。但是,如果可以选择,请使用jq
改为生成 JSON。这确保了$FILENAME
被正确引用。
request_body=$(jq -n --arg fname "$FILENAME" '
{
jsonrpc: "2.0",
method: "Player.Open",
params: {item: {file: $fname}}
}'
首先使用请求正文的内容定义一个变量会更简单:
#!/bin/bash
header="Content-Type: application/json"
FILENAME="/media/file.avi"
request_body=$(< <(cat <<EOF
{
"jsonrpc": "2.0",
"method": "Player.Open",
"params": {
"item": {
"file": "$FILENAME"
}
}
}
EOF
))
curl -i -X POST -H "$header" -d "$request_body" http://192.167.0.13/jsonrpc
这个定义可能需要解释才能理解,但请注意两大好处:
- 您消除了一定程度的引用
- 您可以轻松地设置文本格式以提高可读性。
首先,您有一个从文件中读取的简单命令替换:
$( < ... ) # bash improvement over $( cat ... )
不过,您可以指定一个进程替换,而不是文件名,其中使用命令的输出,就好像它是文件的正文一样。
进程替换中的命令很简单cat
,它从此处的文档中读取。这是包含您的请求正文的此处文档。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)