elispでurl-http その1
elispでhttpを扱うため、url-http.elを使うことにした。emacsにもともと同梱されているので。
(require 'url-http)
で使える。
Infoを見つつ要点ぽいところを訳してみる。
urlのパース
ライブラリ中のたいていの関数はurlの文字列ではなく「パースされた」urlを引数に取る。これは次の形のベクターとなっている:
[TYPE USER PASSWORD HOST PORT FILE TARGET ATTRIBUTES FULL]
この形式と文字列の相互変換のために2つの関数が用意されている。
- url-generic-parse-url url
文字列urlをパース
- url-recreate-url url
その逆
ex)
(url-generic-parse-url "http://www.google.com/") ;=> ["http" nil nil "www.google.com" 80 "/" nil nil t] (url-recreate-url ["http" "nos" "123" "www.example.com" 80 "/test/directory" "section2" nil t]) ;=> "http://nos:123@www.example.com/test/directory#section2"
FULLってのはurl-generic-parse-urlに与えた文字列がちゃんとURLの体裁を成しているかを判定するのに使う。たとえば"http:/www.google.com/"*1とかを与えるとここがnilになる。
attributesはよくわからないので保留。
urlの取得
- url-retrieve-synchronously url
urlを取得する。取得が完了するまで待って、そのデータを持ったバッファーを返す。urlは上のどちらの形式でもよい。
- url-retrieve url callback &optional cbargs
urlをバックグラウンドで取得する。完全に取得が終わった後、cbargsを引数としてcallbackを呼び出す。
ex)
(url-retrieve-synchronously "http://www.google.com/" (lambda (x) (message (format "%s" x)))) ;=> #<buffer *http www.google.com:80*> (url-retrieve "http://www.google.com/" (lambda (x) (message (format "%s" x)))) ;=> #<buffer *http www.google.com:80*> ;メッセージ: (:redirect http://www.google.co.jp/) (url-retrieve "http://www.google.co.jp/" (lambda (x) (message (format "%s" x)))) ;=> #<buffer *http www.google.co.jp:80*> ;メッセージ: nil (url-retrieve "http://www.google.com/" (lambda (status x y z) (message (format "%s %s %s %s" status x y z))) '(1 2 3)) ;=> #<buffer *http www.google.com:80*<3>> ;メッセージ: (:redirect http://www.google.co.jp/) 1 2 3
とりあえず今日はここまで。
*1:/が1個足りない