考虑下面的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 {
发生了错误
如何修复上述命令?
已更新:实际上我以前没有遇到问题就可以运行命令,不知道最近为什么会出现问题。
答案 0 :(得分:77)
我记得用Bash手册页和detailed here中描述的“Here Document”来做另一种方法。 @-
表示从STDIN读取正文,而<< EOF
表示管道脚本内容,直到“EOF”作为STDIN卷曲。与使用单独的文件或“回显变量”方法相比,这种布局可能更容易阅读。
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方法剥离了换行符?!?
答案 1 :(得分:24)
根据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文件。这是否有用取决于你想要完成的任务。
答案 2 :(得分:13)
您可以将json分配给var:
json='
{
"field1": "test",
"field2": {
"foo": "bar"
}
}'
现在,您可以使用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 @-
答案 3 :(得分:12)
你应该使用外部双引号,并转义所有内部引号,如下所示:
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\"
}
}"
答案 4 :(得分:8)
由于某种原因,此Here Document方法剥离换行符
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时的单一刻度,但不是第二次。