web-dev-qa-db-ja.com

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 {でエラーが発生したようです。上記のコマンドを修正するにはどうすればよいですか?

更新:実際に問題なくコマンドを実行することができましたが、最近問題が発生した理由はわかりません。

56
Ryan

Bashのマニュアルページで説明されている「ヒアドキュメント」と 詳細はこちら を使用してこれを行う別の方法を思い出しました。 @-は、STDINから本文を読み取ることを意味し、<< EOFは、カールするSTDINとして「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

注:--trace <outfile> curlオプションを使用して、ワイヤ上にあるものをexactly記録します。何らかの理由で、このHere Documentアプローチは改行を削除しますか?!?

83
Eric Bolinger

JSONを変数に配置するというMartinの提案に沿って、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ファイルで実行するだけです。それが有用かどうかは、あなたが何を達成しようとしているかに依存します。

25
Bampfer

外側の二重引用符を使用し、次のようにすべての内側の引用符をエスケープする必要があります。

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

あなたの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 @-
14
Martin Konecny

何らかの理由で、この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

最初に定義されたときにEOFを囲むシングルティックに注意してください。

10
Tim Gebhardt