Common Lisp で HTTP リクエストと言えば DRAKMA 。
 
ただ DRAKMA を使いはじめると、
 

  • GET した時のレスポンスコード(200 とか 404 とか)はほしいけど、body までは欲しくない時はどうすればいいのかな?
  • Web から画像を落としたいんですけど・・・

 
という日常業務に関わる部分で、DRAKMA がカバーしていない(と思われる)問題にぶち当たる。
 
でいろいろ検索したら、TRIVIAL-HTTP というパッケージを見つけた。
 

 
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))
 

 
 
 

§1551 · Posted By · 4月 27, 2014 · Development · Tags: , , , , , , , , · [Print]