【问题标题】:"Unexpected end of JSON input" error when trying to do curl POST command [duplicate]尝试执行 curl POST 命令时出现“JSON 输入意外结束”错误 [重复]
【发布时间】:2020-07-01 20:41:03
【问题描述】:

我在 curl -X POST 命令中发送正确的 json 数据时遇到问题。我已经通过复制并粘贴硬编码值在我的 Mac 上成功地在本地运行 POST 命令,但我现在正在尝试创建一个 .sh 脚本来自动化这个过程。运行下面的代码时出现此错误:

{"message":"JSON 输入意外结束"}

这是来自 JSON_STRING 的输出 json,名称为通用名称,没有其他任何更改:

{ "url": "api_url", "tileset": "username.filename" }

一旦我知道如何在 POST 命令中正确格式化 json,我就知道它会起作用,但我似乎无法正确使用语法。希望一组新鲜/经验丰富的 bash 眼睛能够抓住我的错误:)。此外,我拥有的所有变量都是正确的,并且已经通过在 mac 终端中运行变量值得到确认。提前感谢您的帮助!

    curl_url="http://${bucket}.s3.amazonaws.com/${key}"
    echo $curl_url

    tileset_id="username.filename"

    JSON_STRING=$(jq -n \
                  --arg bn "$curl_url" \
                  --arg on "$tileset_id" \
                  '{url: $bn, tileset: $on}')

    echo $JSON_STRING

    curl -X POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d $JSON_STRING 'apiurl'

【问题讨论】:

  • 将生成的json字符串打印出来分享出去#
  • @Jens 这里是生成的 json 字符串 { "url": "api_url", "tileset": "username.filename" } 我将 api_url、用户名和文件名值更改为通用但没有与任何间距等混淆。
  • 您能否将其添加到问题中,而不是作为评论
  • 最后的`'apiurl'`是什么?我不确定我认为它会被 curl 用作 json 字符串的一部分
  • 刚刚更新了问题。抱歉,我仍在学习堆栈溢出的技巧。那是我要发布到的 api 的 url。我把它替换掉了,因为它里面有访问令牌等等。

标签: bash shell curl sh jq


【解决方案1】:

绝对需要引用shell变量:

curl ... -d "$JSON_STRING" http://example.com/end/point

否则shell会做分词,-d的参数就变成{"url":


附带说明,bash 数组有助于提高可读性:

curl_url="http://${bucket}.s3.amazonaws.com/${key}"
tileset_id="username.filename"

JSON_STRING=$(
    jq -n \
          --arg bn "$curl_url" \
          --arg on "$tileset_id" \
          '{url: $bn, tileset: $on}'
)

curl_opts=(
    -X POST
    -H "Content-Type: application/json" 
    -H "Cache-Control: no-cache" 
    -d "$JSON_STRING"
)

curl "${curl_opts[@]}" 'apiurl'

【讨论】:

猜你喜欢
  • 2021-07-26
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多