【问题标题】:How to PUT a json object with an array using curl如何使用 curl 将 json 对象与数组一起放置
【发布时间】:2013-03-03 18:09:42
【问题描述】:

我有一系列数据要输入数据库。输入数据的用户界面不适合批量输入,所以我正在尝试制定一个等效的命令行。当我在 chrome 中检查 UI 的网络请求时,我看到了一个 json 对象的 PUT 请求。当我尝试复制请求时

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

我收到一个错误

curl: (3) [globbing] 位置 X 不支持嵌套大括号

其中 X 是第一个“[”的字符位置。

如何 PUT 包含数组的 json 对象?

【问题讨论】:

    标签: json curl


    【解决方案1】:

    您的命令行应该在您要在 PUT 中发送的字符串之前插入一个 -d/--data,并且您要设置 Content-Type 而不是 Accept。

    curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' \
         http://example.com/service
    

    使用问题中的确切 JSON 数据,完整的命令行将变为:

    curl -H 'Content-Type: application/json' -X PUT \
        -d '{"tags":["tag1","tag2"],
             "question":"Which band?",
             "answers":[{"id":"a0","answer":"Answer1"},
                        {"id":"a1","answer":"answer2"}]}' \
        http://example.com/service
    

    注意:JSON 数据包装仅是为了便于阅读,对curl 请求无效。

    【讨论】:

    • -1 因为 Content-Type(而不是 Accept)是在这种情况下应该设置的标头。
    • 对于那些想知道的人,[JSON] 只是 JSON 字符串的占位符。不要在 JSON 字符串周围添加额外的方括号。
    【解决方案2】:

    应该提到的是,Accept 标头告诉服务器我们正在接受什么,而在此上下文中的相关标头是 Content-Type

    在发送 JSON 时,通常建议将 Content-Type 指定为 application/json。 curl 的语法是:

    -H 'Content-Type: application/json'
    

    所以完整的 curl 命令将是:

    curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`
    

    【讨论】:

      【解决方案3】:

      虽然原始帖子有其他问题(即缺少“-d”),但错误消息更笼统。

      curl: (3) [globbing] 位置 X 不支持嵌套大括号

      这是因为花括号 {} 和方括号 [] 是 curl 中的特殊通配符。 要关闭此通配符,请使用“-g”选项。

      例如,如果没有 "-g" 来关闭 curl globbing,以下 Solr 方面查询将失败: curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

      【讨论】:

      • 这对我来说是正确的解决方案,使用 -g 按预期工作。谢谢@Yonik
      • 天哪,我一直在寻找解决我的 GraphQL curl 问题的方法,这对我有帮助。很棒的酱汁。
      【解决方案4】:

      唯一有用的是使用 JSON 文件而不是 json 正文文本。基于How to send file contents as body entity using cURL

      【讨论】:

        【解决方案5】:

        尝试使用单引号而不是双引号以及-g

        以下方案对我有用

        curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com
        

        curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com
        

        这特别解决了我的错误 curl 命令错误:bad url Colon is first character

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 2016-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-21
          • 2020-10-13
          相关资源
          最近更新 更多