当前位置: 首页>>技术教程>>正文


curl 与多线JSON

, , ,

问题描述

考虑下面的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"
    }
}'

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

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

最佳解决办法

我记得使用Bash手册页和detailed here中描述的”Here Document”执行此操作的另一种方法。 @-表示从STDIN读取正文,而<< EOF表示管道脚本内容,直到”EOF”作为STDIN curl 。与使用单独的文件或“回显变量”方法相比,这种布局可能更容易阅读。

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

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

次佳解决办法

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

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

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

第三种解决办法

您可以将json分配给var:

json='
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

现在,您可以使用stdin将其转发为 curl :

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

第四种办法

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

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\"
    }
}"

第五种办法

For some reason, this Here Document approach strips newlines

@ 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

注意第一次定义时围绕EOF的single-ticks,而不是第二次。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6274.html,未经允许,请勿转载。