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個足りない