Upgrade to Pro — share decks privately, control downloads, hide ads and more …

開発効率爆上がり curl + jq 入門講座

mu_zaru
October 08, 2020

開発効率爆上がり curl + jq 入門講座

配信動画はこちら
https://www.youtube.com/watch?v=-HohpQP-lwU

もし良かったらムーザルちゃんねるのチャンネル登録お願いします!
https://www.youtube.com/channel/UCLPHXwLp90A5R69Eltxo-sg

Twitter でもプログラミングネタをつぶやいているのでフォローお待ちしております。
ムー
https://twitter.com/mu_book
zaru
https://twitter.com/zaru

mu_zaru

October 08, 2020
Tweet

More Decks by mu_zaru

Other Decks in Programming

Transcript

  1. 話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近の仕事は figma で画

    面設計をつくることで す。英語の勉強してる。 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!
  2. ページを取得する $ curl https://example.com $ curl -o ouput.html https://example.com コマンド

    普通に見るだけならオプションなしで URL を指定すれば OK ダウンロードしたい場合は -o もしくは --output オプション でファイル名を指定すれば保存することができる
  3. POST する $ curl -d "name=zaru" -d "hoge=piyo" https://example.com コマンド

    -X POST で明示的に POST メソッドを使えるが -d や --data でデータ送信をすると自動で POST になる デフォルトで Content-Type は application/x-www-form-urlencoded になる (<form> タグの enctype 属性の初期値)
  4. JSON を POST する $ curl -H "Content-Type: application/json" \

    -d '{ "key" : "value" }' https://example.com コマンド Content-Type を -H (Header) で application/json と明 示することで、受け取るサーバ側がパラメータを JSON と して認識する。
  5. JSON ファイル を POST する $ curl -H "Content-Type: application/json"

    \ -d @params.json https://example.com コマンド 大きな JSON を POST したい場合は JSON ファイルを指定 することもできる。curl では @ファイル名 を付けるとファ イルを読み込むことができる
  6. BASIC 認証 $ curl -u id:password https://example.com コマンド ↓BASIC 認証以外に

    Digest 認証などを通したい場合 $ curl --digest -u id:password https://example.com $ curl --any-auth -u id:password https://example.com コマンド
  7. API キーを指定する $ curl -H 'Authorization: Bearer xxxxx' https://example.com コマンド

    よくある API キーを Header に指定してねという時は、-H オプションで Header を書くことができる。Header の指定 方法は API によって異なる
  8. よく使うオプション -d / --data : POST したいパラメータ -H / --header

    : リクエスト Header を指定する -u : BASIC 認証の ID Password を指定する curl 基本のまとめ
  9. 値アクセスは . jq 'セレクタ' コマンド jq コマンドにセレクタを渡すことで任意の情報にアクセスすることができる。 jq '.user.name' #=>

    "zaru" コマンド { "user": { "name": "zaru" } } json . ドットで key を接続することでオブジェ クトの値にアクセスすることができる
  10. 配列は [] jq '.users[]' #=> "zaru" "mu" jq '.users[0]' #=>

    "zaru" コマンド { "users": [ "zaru", "mu" ] } json [] で配列要素にアクセスができる。0から 始まるインデックス番号を指定することも できる
  11. 整形は | と {} jq '.users[] | { key: .name

    }' { "key": "zaru" } { "key": "mu" } コマンド { "users": [ { "id": 1, "name": "zaru", "profile_image": "https://example.com/zaru.png", "address": "北海道" }, { "id": 2, "name": "mu", "profile_image": "https://example.com/mu.png", "address": "沖縄" } ] } json | (パイプ)でデータを渡して連携 できる。 {} で指定フォーマット にすることもできる
  12. Cookie を送信する $ curl -b 'key=val; key2=val2;' https://example.com コマンド -b

    または --cookie オプションで、セミコロン区切りの key-value を送信することができる
  13. Cookie を保存する $ curl -c cookie.txt https://example.com コマンド サーバから返される Set-Cookie

    のデータを -c オプション で指定したファイルに保存することができる。主にログイン 時のセッションキーを保存するのに使ったりする $ cat cookie.txt # Netscape HTTP Cookie File # https://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. localhost FALSE / FALSE 0 key value 保存される Cookie ファイルの中身
  14. 保存した Cookie を送信する $ curl -b cookie.txt https://example.com コマンド -b

    オプションにファイル名を指定すると(正確には = が含 まれていないと)、-c オプションで保存したファイル形式 の Cookie を送信できる。大量の Cookie を送りたかったり する時に便利。
  15. ファイルをアップロードする $ curl -F fi[email protected] https://example.com コマンド -F または --form

    オプションでファイル名とファイルパス を指定することで Content-Type multipart/form-data で POST することができる(<form> タグの enctype multipart/form-data と同じ)。
  16. .. で再起検索 jq '.. | .name?' コマンド JSON の中にあるはずだが、どの階層にあるのかが分からな いけど、とりあえず見つけたい。という時に使う。

    .. で再起的に探してくれるので、パイプで指定のキーを付け る。存在しないオブジェクトもあるので ? で null を無視す る
  17. 階層構造を表示 jq '[path(..) | map(if type=="number" then "[]" else tostring

    end) | join(".") | split(".[]") | join("[]")] | unique | map("."+.) | .[]' コマンド 魔法すぎる感じですが… JSON の階層構造を良い感じに表示 してくれる。これを読み解ければ jq マスターが近い!
  18. レスポンス速度を計測 $ curl https://example.com -s -o /dev/null \ -w "%{time_total}\n"

    コマンド -w オプションで curl のいろんな情報を変数指定で表示す ることができる。 time_total がレスポンス時間。 また、余計な出力をなくしたいので -s または --silent オプ ションでダウンロード進捗を消し、 -o または --output オ プションでダウンロードした内容を /dev/null の闇に放り 投げる。
  19. ベンチマークする $ for i in {1..10}; do curl https://example.com \

    -s -o /dev/null -w "%{time_total}\n"; end | \ awk '{sum+=$1;print $1} END {print "AVG: " sum/NR} コマンド 10回のリクエストを送り、出力されたレスポンスタイムを awk で平均値をとるコマンド例 awk 自体の解説はまたの今度に… NR は組み込み変数で行数を表します
  20. URL は動的に変えられる $ curl http://example.com/[1-100].jpg $ curl https://example.com/{hoge,piyo,fuga}.jpg コマンド 表現は限られるが、[n-m]

    で連番、 {n,m} で指定ワードで URL を生成して連続でリクエストすることができる