Bash script: Use string variable in curl JSON Post data

bash, curl, json

Solution

You can use:

request_body=$(cat <<EOF
{
  "jsonrpc": "2.0",
  "method": "Player.Open",
  "params": {
    "item": {
      "file": "$FILENAME"
    }
  }
}
EOF
)

However, if it is an option, use `jq` to generate the JSON instead. This ensures that the value of `$FILENAME` is properly quoted.

request_body=$(jq -n --arg fname "$FILENAME" '
{
  jsonrpc: "2.0",
  method: "Player.Open",
  params: {item: {file: $fname}}
}'

Problem

I want to send a json request and embedd a variable in the post data. I did a little research and I came up with the single quotes around the variable. ``` #!/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 ``` Unfortunately I get some errors: ``` 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"} ``` Appearently there are some problems with the braces and the http answer states, that the command could not be executed. What's wrong with my code here? Thanks! This is my `curl` version: ``` 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 ```

Original source

Related problems