卷曲与多线JSON

Rya*_*yan 63 bash shell ubuntu curl

考虑下面的curl命令,是否可以在JSON中允许换行(没有minify)并直接在bash中执行(Mac/Ubuntu)

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
'
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'
Run Code Online (Sandbox Code Playgroud)

当我运行上面的命令时,似乎错误发生在second { 如何修复上述命令?

更新:实际上我以前没有问题就可以运行命令,不知道为什么最近会出现问题.

Eri*_*ger 92

我想起了另一种方式来做到这一点与在Bash的手册页和描述的"在这里文件" 在这里详细.该@-方法从stdin读取身体,而<< EOF手段来管脚本内容,直到"EOF"作为STDIN卷曲.与使用单独的文件或"回显变量"方法相比,这种布局可能更容易阅读.

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: application/json; charset=utf-8' \
--data-binary @- << EOF
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

注意:使用--trace <outfile>curl选项准确记录电线上的内容.出于某种原因,这个Here Document方法剥离了换行符?!?

  • 这是干净的,没有额外的引用,没有逃脱,它工作得很好.谢谢. (4认同)
  • 是的,您可以将输出通过管道传输到另一个命令,尽管位置正好在中间。在 stdin 重定向之后添加 stdout 重定向。使用字数统计的示例:`-d @- &lt;&lt; EOF | 厕所` (3认同)
  • 我们可以使用具有这样语法的管道吗? (2认同)
  • 不是在这里删除新行的文档,而是`curl -d`选项:https://curl.haxx.se/docs/manpage.html#-d。使用`--data-binary`保留换行符和回车符。 (2认同)

Bam*_*fer 27

按照Martin建议将JSON放在变量中的建议,你也可以将JSON放在一个单独的文件中,然后-d使用curl的@语法提供文件名:

curl -0 -v -X POST http://www.example.com/api/users \
  -H "Expect:" \
  -H 'Content-Type: text/json; charset=utf-8' \
  -d @myfile.json
Run Code Online (Sandbox Code Playgroud)

缺点是显而易见的(2个或更多文件,你曾经有一个.)但从好的方面来说,你的脚本可以接受文件名或目录参数,你永远不需要编辑它,只需在不同的JSON文件上运行它.这是否有用取决于你想要完成的事情.


Dmi*_*kov 15

你应该使用外部双引号,并转义所有内部引号,如下所示:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
"
{
    \"field1\": \"test\",
    \"field2\": {
        \"foo\": \"bar\"
    }
}"
Run Code Online (Sandbox Code Playgroud)


Mar*_*cny 15

您可以将json分配给var:

json='
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用stdin以下命令转发此卷曲:

echo $json | curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @-
Run Code Online (Sandbox Code Playgroud)


Tim*_*rdt 14

出于某种原因,此Here Document方法剥离换行符

@ eric-bolinger Heredoc剥离换行的原因是因为你需要通过引用EOF来告诉你的Heredoc保留换行符:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @- <<'EOF'

{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF
Run Code Online (Sandbox Code Playgroud)

注意第一次定义时围绕EOF的单刻度,而不是第二次.


kan*_*kyu 10

我认为这可以是一个答案

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
--data-raw '
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'
Run Code Online (Sandbox Code Playgroud)