【问题标题】:Sending nested JSON object using HTTPie使用 HTTPie 发送嵌套的 JSON 对象
【发布时间】:2016-05-13 16:59:09
【问题描述】:

我正在尝试使用 HTTPie 解析以发送一些嵌套的 JSON 对象,但我找不到方法。很清楚如何发送 JSON 对象而不是嵌套对象,例如

{“用户”:{“名称”:“约翰” “年龄”:10 } }

【问题讨论】:

  • json 中缺少逗号。应该是{ "user": { "name": "john", "age": 10 } }

标签: json httpie


【解决方案1】:

2022 年 1 月发布的 HTTPie 3.0 更新:

现在使用 HTTPie 语言内置了对嵌套 JSON 的支持:

$ http pie.dev/post \
  tool[name]=HTTPie \
  tool[about][homepage]=httpie.io \
  tool[about][mission]='Make APIs simple and intuitive' \
  tool[platforms][]=terminal \
  tool[platforms][]=desktop \
  tool[platforms][]=web \
  tool[platforms][]=mobile 
{
    "tool": {
        "name": "HTTPie",
        "about": {
            "mission": "Make APIs simple and intuitive"
            "homepage": "httpie.io",
        },
        "platforms": [
            "terminal",
            "desktop",
            "web",
            "mobile",
        ]
    }
}

您可以在文档中了解有关嵌套 JSON 的更多信息:https://httpie.io/docs/cli/nested-json


HTTPie 3.0 之前的旧答案:

您可以pass the whole JSON via stdin:

$ echo '{ "user": { "name": "john", "age": 10 } }' | http httpbin.org/post

specify the raw JSON as value with :=:

$ http httpbin.org/post user:='{"name": "john", "age": 10 }'

【讨论】:

  • 如果 name 实际上是一个 json 对象而不是一个表怎么办。因此,在您命名的用户内部:{“id”:“x”,“fn”:“xx”}
  • “表”是什么意思?在上面的两个示例中,HTTPie 从您的问题中发送 JSON 对象。
  • 对不起,我的表是数组
  • 上述两种方法都允许您指定任意有效的 JSON 数据(对象、数组、布尔值等)。请参阅答案中包含的链接。
  • 在您的示例中,第二级是通过书签通过嵌入的 Json 文件完成的:=@bookmarks.json。为简单起见,如果 hobbies:='["http", "pies"]' 不是数组而是对象 "hobbies" : {"x": "x", "Y": y}。你会怎么做。我的意思是我尝试在第二级使用“:=”,但只要它不是数组,它就不起作用。
【解决方案2】:

我喜欢这种方式:

$ http PUT localhost:8080/user <<<'{ "user": { "name": "john", "age": 10 }}'

最好是和相关命令有相同的前缀,方便在bash中找到Ctrl+R的命令:

$ http localhost:8080/user/all
$ http GET localhost:8080/user/all # the same as the previous
$ http DELETE localhost:8080/user/234

如果您有fishshell,而没有Here Strings,我可以提出以下解决方法:

~> function tmp; set f (mktemp); echo $argv > "$f"; echo $f; end
~> http POST localhost:8080/user < (tmp '{ "user": { "name": "john", "age": 10 }}')

【讨论】:

  • @JuanSalvador 我们可能会为我为上述评论所做的鱼做一些类似的解决方法。
  • 我的偏好是使用 fzf(shell 工具),它可以让 ctrl+R 进行模糊查找,因此即使搜索到的文本在旧命令中的不同位置,它也可以找到旧命令:D
【解决方案3】:

httpie 文档中提到的另一种方法是使用JSON file;对于更冗长且嵌套更深的有效负载,这对我来说效果很好。

http POST httpbin.org/post < post.json

【讨论】:

    【解决方案4】:

    在 Windows 10 (cmd.exe) 上,由于引用规则,语法略有不同。属性/字符串需要用双引号括起来。

    http -v post https://postman-echo.com/post address:="{""city"":""london""}"
    
    POST /post HTTP/1.1
    Content-Type: application/json
    Host: postman-echo.com
    User-Agent: HTTPie/2.3.0
    {
        "address": {
            "city": "london"
        }
    }
    
    

    您还可以使用 echo 发送整个对象,而无需双引号。

    echo {"address": {"city":"london"} } | http -v post https://postman-echo.com/post
    

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2015-08-01
      • 2014-12-29
      • 2020-03-07
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多