BASH脚本:在Curl JSON帖子数据中使用字符串变量



我想发送一个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

此定义可能需要解释才能理解,但请注意两个大好处:

  1. 您消除了引用的水平
  2. 您可以轻松地格式化文本以获得可读性。

首先,您有一个简单的命令替换,可以从文件中读取:

$( < ... )   # bash improvement over $( cat ... )

,而不是文件名,而是指定一个过程替换,其中命令的输出被使用,就好像是文件的主体。

该过程替换中的命令只是cat,它从此处的文档中读取。这是其中包含您的请求主体的文档。

我的建议:

#!/bin/bash
FILENAME="/media/file 2.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

差异是-d(而不是破折号)中的连字符,而$FILENAME周围的双引号。

这是将数据从文件插入JSON属性的另一种方法。该解决方案基于一个非常酷的命令,称为jq

下面是一个准备请求JSON数据的示例,用于在数字海洋上创建CoreOS液滴:

# Load the cloud config to variable
user_data=$(cat config/cloud-config)
# Prepare the request data 
request_data='{
  "name": "server name",
  "region": "fra1",
  "size": "512mb",
  "image": "coreos-stable",
  "backups": false,
  "ipv6": true,
  "user_data": "---this content will be replaced---",
  "ssh_keys": [1234, 2345]
}'
# Insert data from file into the user_data property
request_data=$(echo $request_data | jq ". + {user_data: "$user_data"}")

相关内容

  • 没有找到相关文章

最新更新