Common Lisp で HTTP リクエストと言えば DRAKMA 。
ただ DRAKMA を使いはじめると、
- GET した時のレスポンスコード(200 とか 404 とか)はほしいけど、body までは欲しくない時はどうすればいいのかな?
- Web から画像を落としたいんですけど・・・
という日常業務に関わる部分で、DRAKMA がカバーしていない(と思われる)問題にぶち当たる。
でいろいろ検索したら、TRIVIAL-HTTP というパッケージを見つけた。
使い方はDRAKMAと同じくらい簡単。
まずは、body 値には関心がない TRIVIAL-HTTP:http-get ととりあえず落とせる情報は全部落としてしまう DRAKMA::http-request の time を比較してみる。
;; CLISP + Mac OS X 10.9 (time (TRIVIAL-HTTP:http-get "http://basicwerk.com/")) Real time: 0.035161 sec. Run time: 0.001789 sec. Space: 28772 Bytes (time (drakma:http-request "http://basicwerk.com/" :connection-timeout nil)) Real time: 0.095537 sec. Run time: 0.070419 sec. Space: 1364472 Bytes GC: 1, GC time: 0.011027 sec.
はい、TRIVIAL-HTTP:http-get の方が単純に(多分、余計なものに関わってないだけ)早いですね。
さて、今度は画像のダウンロード(Perl でいうところの use LWP::Simple; で $save_image = get(image_url);)。
(setf image_url "http://basicwerk.com/image/bw_S.png") (setf save_image "./image/bw_S.png") (TRIVIAL-HTTP:http-download image_url save_image :signal-error? nil) ;; ↑でダウンロードだけならOK ;; ダウンロード結果を補足したいときは、 ;; 多値を受け取る multiple-value-bind を使う (multiple-value-bind (bytes url) ;; この url は実際にダウンロードした url (TRIVIAL-HTTP:http-download image_url save_image :signal-error? nil) (if (and bytes url) (list bytes url) nil))