ubuntu 使用JSON的多行进行 curl

xghobddn  于 2023-03-07  发布在  其他
关注(0)|答案(7)|浏览(277)

考虑下面的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 {发生了错误如何修复上面的命令?

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

rt4zxlrg1#

我记得另一种方法是使用Bash手册页和detailed here中描述的“Here Document”。@-意味着从STDIN读取主体,而<< EOF意味着将脚本内容作为STDIN传输到curl,直到“EOF”。这种布局可能比使用单独的文件或“回显变量”方法更容易阅读。

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

注意:使用--trace <outfile> curl选项可以 * 精确地 * 记录网络上的内容。出于某种原因,此Here Document方法会去掉换行符。(更新:换行符被curl -d选项删除。已更正!)

ht4b089n

ht4b089n2#

沿着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文件上运行它。这是否有用取决于你试图完成什么。

kt06eoxx

kt06eoxx3#

出于某种原因,此Here Document方法会去掉换行符
@eric-bolinger Heredoc去掉换行符的原因是因为你需要告诉你的Heredoc通过引用EOF来保留换行符:

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时,EOF周围的单勾号,但第二次没有。

lmvvr0a8

lmvvr0a84#

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

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

rxztt3cl5#

您可以将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 @-
rslzwgfq

rslzwgfq6#

我想这是一个答案

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"
    }
}'
dy2hfwbg

dy2hfwbg7#

我最近很难通过curl传递多行JSON数据。以上解决方案对我都不起作用,我可以通过在“-d”参数中使用“@-”从stdin阅读数据来解决这个问题。在stdin中,我定义了包含在“BODY”关键字中的JSON主体。

curl \
    -X POST http://www.example.com/api/users \
    -H 'Content-Type: application/json' \   
    -d @- <<BODY
    {
      "field1": "test",
      "field2": {
        "foo": "bar"
      }
    }
    BODY

这个链接帮助我理解不同旋度参数的含义。

相关问题