satkaku

色々かいたものの試行錯誤

curlで疎通確認自動化(のための便利なオプション)

WebAPIの疎通確認とかを自動化したいなー、とか思ったとき、勿論ちゃんと回帰テスト書いて自動化しましょうよ、ってのは置いといて、簡単なものならcurlとかでやっちゃうのが便利です。Jenkinsなんてすごいcronに過ぎない的感覚によれば、cronでも別に構わないわけです。

ただ、man curlをやれば分かる通り、curlはバカみたいにオプションが多いです。正直見るのがめんどくさいので、疎通確認の自動化に向けて便利なオプションをメモ。あくまで簡単な疎通確認程度なので、HTTPのステータスコードとレスポンス時間くらい分かればまあいいやくらいのものです。

$ curl http://sat.hateblo.jp/

とりあえず、基本。
レスポンス内容をそのまま出します。

$ curl http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-w」オプションで出力内容を加工できるのですが、組み込み変数としてhttp_codeでHTTPステータスコード、time_totalでレスポンス時間を出力できます。これだとレスポンス内容自体も出力されてしまうので、http_codeの前に区切り文字を適当に置いて、| awk -F "区切り文字" '{print $2;}'とかやればHTTPステータスコードとレスポンス時間だけ取れてスッキリします。

と、これで終わりでもいいのですが現実には色々と壁があります。まずはhttpsに接続する際。SSL証明書の警告なんかが出るとこだと上記のだと通りません。

$ curl --insecure http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「--insecure」で、SSL証明書の警告を無視します。さて、Basic認証がかかってるなんてこともあります。

$ curl --insecure -u ユーザー名:パスワード http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-u ユーザー名:パスワード」でBasic認証もさくっと通します。しかし、まだ敵はいます。Cookie使ってログインしとかないと使えないAPIなんかの場合は、最初にログインしても、2回目以降に認証情報が引き継がれません。

$ curl --insecure -u ユーザー名:パスワード -c cookie.txt http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-c ファイル名」でCookieを保存できます。これでログインしときます。

$ curl --insecure -u ユーザー名:パスワード -b cookie.txt http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-b ファイル名」でCookieを送信できます。ログイン以降のリクエスト時にはこっちを使うようにすればOKです。

$ curl --insecure -u ユーザー名:パスワード -b cookie.txt -d キー=値 http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-d キー=値」でPOSTデータを送信できます。これでようやく一通りのリクエストを試すことが出来そうです。ですが、これだとサーバーが落ちてた際などにコマンドの実行が終わりません。

$ curl -m 30 --insecure -u ユーザー名:パスワード -b cookie.txt -d キー=値 http://sat.hateblo.jp/ -w "%{http_code} %{time_total}"

「-m 秒数」でタイムアウト時間を秒で設定できます。これで一安心です。

あとは配列つくって確認したいAPIを順次実行するようにしたり、AWKでフォーマット整えたり、結果をファイルに出力したり、結果見てアラート出したり、定期実行するようにすれば完成です。


めんどくさいですよね。