shellscriptなどでcurlを使ってjsonをPOSTする場合
エスケープや変数展開だったりと気にすることが多く毎度躓いてるなーと思っていたのですが@
+ ファイルorヒアドキュメントを使って書くと良さそうです
もっと早く気づきたかった・・・
- 参考
bash - Curl with multiline of JSON - Stack Overflow
ヒアドキュメント
- ローカルに適当な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読んだら普通に書いてあるのでなんで今まで知らなかったんだ案件でした
またスクリプトで書いてると下記メリットがあると思います
- スクリプト内で改行を含めることが可能
- 可読性を上げることができる
- 変数展開が可能
- クォーテーションなど意識しなくて良い
覚えておこうと思います