notebook

都内でWEB系エンジニアやってます。

curlを使うときのデータの渡し方

shellscriptなどでcurlを使ってjsonをPOSTする場合

エスケープや変数展開だったりと気にすることが多く毎度躓いてるなーと思っていたのですが@ + ファイルorヒアドキュメントを使って書くと良さそうです

もっと早く気づきたかった・・・

  • 参考

bash - Curl with multiline of JSON - Stack Overflow

stackoverflow.com

ヒアドキュメント

  • ローカルに適当なrackサーバを用意してます
piyo_number=100
curl -XPOST http://127.0.0.1:3000 \
  -H "Content-Type: application/json" \
  -d @- <<EOS
{
  "query": {
    "hoge": 1,
    "fuga": "fuga",
    "piyo": ${piyo_number}
  }
}
EOS
  • request.body
"{  \"query\": {    \"hoge\": 1,    \"fuga\": \"fuga\",    \"piyo\": 100  }}"
  • -dオプションは@-で標準入力から受け取る事ができる
  • ヒアドキュメントは標準入力へ値を渡すのでEOS ~ EOSまでの内容をパイプで渡す

とうことですね

hoge=$(cat <<EOS
  hoge
  fuga
  ${piyo_number}
EOS
)

よくあるこういう書き方はcatに標準入力としてヒアドキュメントを渡している状態

標準入力なので下記の様なことをすると入力を待つなんてこともできます

curl -XPOST http://127.0.0.1:3000 \
  -H "Content-Type: application/json" \
  -d @-
  • 入力
{"hoge": "fuga", "piyo": 1}
  • request.body
"{\"hoge\": \"fuga\", \"piyo\":1}"

ファイルの内容を渡す

  • hoge.json
{
  "input": "from File",
  "param1": 1
}
curl -XPOST http://127.0.0.1:3000 \
  -H "Content-Type: application/json" \
  -d @hoge.json
  • request.body
"{  \"input\": \"from File\",  \"param1\": 1}"

まとめ

  • @-で標準入力の内容を送信できる
  • @filenameでファイルの中身を送信できる

man読んだら普通に書いてあるのでなんで今まで知らなかったんだ案件でした

またスクリプトで書いてると下記メリットがあると思います

  • スクリプト内で改行を含めることが可能
    • 可読性を上げることができる
  • 変数展開が可能
    • クォーテーションなど意識しなくて良い

覚えておこうと思います