考虑下面的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 {
发生了错误如何修复上面的命令?
- 更新日期**:实际上,我以前可以运行命令而没有问题,不知道为什么最近会出现问题。
7条答案
按热度按时间rt4zxlrg1#
我记得另一种方法是使用Bash手册页和detailed here中描述的“Here Document”。
@-
意味着从STDIN读取主体,而<< EOF
意味着将脚本内容作为STDIN传输到curl,直到“EOF”。这种布局可能比使用单独的文件或“回显变量”方法更容易阅读。注意:使用
--trace <outfile>
curl选项可以 * 精确地 * 记录网络上的内容。出于某种原因,此Here Document方法会去掉换行符。(更新:换行符被curl -d选项删除。已更正!)ht4b089n2#
沿着Martin将JSON放在变量中的建议,您也可以将JSON放在单独的文件中,然后使用curl的@语法将文件名提供给
-d
:缺点是显而易见的(2个或更多文件,而你曾经有一个)。但从好的方面来说,你的脚本可以接受一个文件名或目录参数,你永远不需要编辑它,只需要在不同的JSON文件上运行它。这是否有用取决于你试图完成什么。
kt06eoxx3#
出于某种原因,此Here Document方法会去掉换行符
@eric-bolinger Heredoc去掉换行符的原因是因为你需要告诉你的Heredoc通过引用EOF来保留换行符:
注意第一次定义EOF时,EOF周围的单勾号,但第二次没有。
lmvvr0a84#
您应该使用外部双引号,并转义所有内部引号,如下所示:
rxztt3cl5#
您可以将json分配给一个var:
现在可以使用
stdin
将其转发到curl:rslzwgfq6#
我想这是一个答案
dy2hfwbg7#
我最近很难通过curl传递多行JSON数据。以上解决方案对我都不起作用,我可以通过在“-d”参数中使用“@-”从stdin阅读数据来解决这个问题。在stdin中,我定义了包含在“BODY”关键字中的JSON主体。
这个链接帮助我理解不同旋度参数的含义。