Bash脚本:在curl JSON Post数据中使用字符串变量

 感性的拉蕾啊拉蕾丶Renata 发布于 2023-01-30 15:18

我想发送一个json请求并在post数据中嵌入一个变量.我做了一点研究,我想出了变量周围的单引号.

    #!/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 

chepner.. 22

更新:使用更简单

request_body=$(cat <

而不是我在下面解释的.但是,如果它是一个选项,则用于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 <

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

    你消除了一定程度的报价

    您可以轻松地格式化文本以便于阅读.

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

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

但是,您可以指定一个进程替换,而不是文件名,在该替换中,命令的输出就像它是文件的主体一样.

流程替换中的命令很简单cat,它从here文档中读取.这是包含您的请求正文的here文档.

2 个回答
  • 我的建议:

    #!/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.

    2023-01-30 15:22 回答
  • 更新:使用更简单

    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,它从here文档中读取.这是包含您的请求正文的here文档.

    2023-01-30 15:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有