Sponsored Link

xml-http-request - 非同期 HTTP 通信ライブラリ

1 SYNOPSIS

(in-package :your-cool-app)

(require "xml-http-request")
(use-package :xml-http-request)

;;; 同期 API

(let ((res (xhr-get "http://www.google.co.jp/")))
  (msgbox "~S" (xhr-response-text res)))

(multiple-value-bind (response http-status header)
    (xhr-get "http://www.google.com/search"
             :query '(:hl "ja" :lr "lang_ja" :ie "UTF-8" :oe "UTF-8" :num 50
                      :q "xyzzy 読み方")
             :encoding *encoding-utf8n*
             :since :epoch
             :key 'xhr-response-values)
  (msgbox "~S~%~S" http-status header))


;;; 非同期 API (Future パターン)

(let ((future (xhr-get-future "http://www.google.co.jp/")))
  (msgbox "do something~%~S" future)
  (let ((res (xhr-future-value future)))
    (msgbox "~S~%~S" (xhr-response-text res) future)))


;;; 非同期 API (マクロ)

(with-xhr-post-async ("http://www.excite.co.jp/world/english/"
                      '(:wb_lp "JAEN" :before "今日雪が降りました。\nテラ寒いです。"))
  (on 200 (res)
      (when (string-match
             "<textarea cols=36 rows=15 name=\"after\".*?>\\([^<>]+?\\)</textarea>"
             (xhr-response-text res))
        (msgbox "~A" (match-string 1))))
  (on :success (res)
      (msgbox "成功しました"))
  (on :failure (res)
      (msgbox "失敗しました... orz"))
  (on :complete (res)
      (msgbox "終了しました")
      (msgbox "~A~%~A" (xhr-response-header res "Server") (xhr-status res))))


;; 非同期 API (関数)

(xhr-post-async "http://search.hatena.ne.jp/questsearch"
                '(:wb_lp "ENJA" :before "xyzzy is awesome!")
                :oncomplete #'(lambda (res)
                                (msgbox "終了しました")
                                (msgbox "http status: ~A" (xhr-status res))
                                (msgbox "response text: ~A" (xhr-response-text res))))

2 DESCRIPTION

xml-http-request は HTTP 通信を行うためのライブラリです。 非同期通信を行えるので xyzzy を止めることなく通信できます。

また、Windows が提供する XMLHttpRequest オブジェクトを利用しているため Proxy や Basic 認証、SSL にも対応しています。

Cookie やキャッシュの管理は XMLHttpRequest 内部で行われます。 これらは IE と共有されます。

3 INSTALL

3.1 NetInstaller でインストール

  1. NetInstaller で xml-http-request をインストールします。

3.2 NetInstaller を使わずにインストール

  1. アーカイブをダウンロードします。

    <URL:http://miyamuko.s56.xrea.com/xyzzy/archives/xml-http-request.zip>

  2. アーカイブを展開して、$XYZZY/site-lisp 配下にファイルをコピーします。

4 MODULE

4.1 PACKAGE

xml-http-request は以下のパッケージを利用しています。

4.2 VARIABLE

なし。

4.3 CONSTANT

なし。

4.4 CODITION

xhr-error
xml-http-request が通知するコンディションの親コンディションです。 xhr-error 自体が通知されることはありません。
xhr-open-error

指定した URL に接続できない場合に通知されるコンディションです。

非同期 API の時は通知されません。

xhr-too-long-url-error

指定した URL が長すぎる場合に通知されるコンディションです。

非同期 API の時は通知されません。

4.5 COMMAND

なし。

4.6 FUNCTION

xhr-get URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された URL のリソースを get します。

この API は同期 API です。 get が終了するまでブロックしレスポンスオブジェクトを返します。

例:

(xhr-response-text
 (xhr-get "http://www.google.co.jp/"
          ;; alist で指定しても ok
          :headers '(:User-Agent "Firefox"
                     :Accept-Language "en, ja")
          :since :epoch))

なお、X-Yzzy-Version というヘッダが必ず送信されます (値は xyzzy のバージョン)。

xhr-get-async URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING ONSUCCESS ONFAILURE ONCOMPLETE HANDLER

指定された URL のリソースを get します。

この API は非同期 API です。 API を呼び出すとすぐに制御を返し、キャンセルオブジェクトを返します。

リクエストを停止したい場合はキャンセルオブジェクトを xhr-abort に指定します。

get が終了すると指定された callback を呼び出します。

例:

(xhr-get-async "http://www.google.co.jp/"
               :headers '(:User-Agent "Mozilla Firefox"
                          :Accept-Language "ja")
               :since :epoch
               :oncomplete #'(lambda (res)
                               (msgbox "~D ~A"
                                       (xhr-status res)
                                       (xhr-status-text res)))
               :handler (list
                         200 #'(lambda (res) (msgbox "OK"))
                         304 #'(lambda (res) (msgbox "not modified"))
                         404 #'(lambda (res) (msgbox "not found"))))

なお、X-Yzzy-Version というヘッダが必ず送信されます (値は xyzzy のバージョン)。

xhr-get-future URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された URL のリソースを get します。

この API は非同期 API です。 API を呼び出すとすぐに制御を返し、Future オブジェクトを返します。 xhr-future-value で Future オブジェクトから値を取得しようとした時点でまだ get が完了していない場合はブロックします。

リクエストを停止したい場合は Future オブジェクトを xhr-abort に指定します。

例:

(let ((future (xhr-get-future "http://www.google.co.jp/"
                              :key 'xhr-status-text
                              :since :epoch)))
  (msgbox "do something~%~S" future)
  (msgbox "~S~%~S"
          (xhr-future-value future :timeout 10)
          future))

なお、X-Yzzy-Version というヘッダが必ず送信されます (値は xyzzy のバージョン)。

See Also:

xhr-head URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された URL に HEAD リクエストを同期的に送信します。

詳細は xhr-get を参照してください。

xhr-head-async URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING ONSUCCESS ONFAILURE ONCOMPLETE HANDLER

指定された URL に HEAD リクエストを非同期に送信します。

詳細は xhr-get-async を参照してください。

xhr-head-future URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された URL に HEAD リクエストを非同期に送信します。

詳細は xhr-get-future を参照してください。

xhr-post URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS ENCODING

指定された URL に DATA を同期的に POST します。

その他の引数および戻り値は xhr-get と同じです。

xhr-post-async URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS ENCODING ONSUCCESS ONFAILURE ONCOMPLETE HANDLER

指定された URL に DATA を非同期に POST します。

詳細は以下を参照してください。

xhr-post-future URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS ENCODING

指定された URL に DATA を非同期に POST します。

詳細は以下を参照してください。

xhr-request METHOD URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された HTTP METHOD を送信します。 DATA がない場合は nil を指定してください。

その他の引数は xhr-post と同じです。

例:

(xhr-request "OPTIONS" url  nil
             :key #'(lambda (res)
                      (split-string (or (xhr-response-header res "Allow") "") #\,)))
;=> ("GET" "HEAD" "OPTIONS" "POST")
xhr-request-async METHOD URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING HANDLER ONSUCCESS ONFAILURE ONCOMPLETE

指定された URL に METHOD を非同期に送信します。

詳細は以下を参照してください。

xhr-request-future METHOD URL DATA &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING

指定された URL に METHOD を非同期に送信します。

詳細は以下を参照してください。

xhr-future-p OBJ
指定された OBJ が Future オブジェクトなら non-nil を返します。
xhr-future-uri FUTURE
指定された Future オブジェクトからリクエスト先の URI を取得します。
xhr-future-completed-p FUTURE
指定された Future オブジェクトのリクエストが完了していたら non-nil を返します。
xhr-future-value FUTURE &KEY NOWAIT NO-REDRAW SLEEP TIMEOUT INTERVAL

指定された Future オブジェクトから結果を取得します。 結果はリクエスト送信時に指定した KEY が適用された結果が返ります。

リクエストが完了していない場合は完了を待ち合わせます。

xhr-requested-uri RES

指定されたレスポンスオブジェクトから URI を取得します。

(xhr-requested-uri (xhr-get "http://www.google.co.jp/"))
;=> http://www.google.co.jp/
xhr-all-response-header RES
すべての HTTP ヘッダを取得します。 戻り値は全ヘッダをまとめた文字列で返します。
xhr-all-response-header-alist RES
すべての HTTP ヘッダを alist で取得します。
xhr-all-response-header-hash RES
すべての HTTP ヘッダを hashtable で取得します。
xhr-response-header RES HEADER
指定した HTTP ヘッダを取得します。 header には "Content-Length" や "Last-Modified" などを指定します。
xhr-response-text RES
HTTP 通信の結果 (body) を取得します。
xhr-response-xml RES

取得した XML を S式で返します。 S 式は xml-parser-modoki と互換性があります(たぶん)。

取得先のリソースが XML でない場合 nil を返します。 XML をテキスト形式で取得したい場合は xhr-response-text を使用してください。

xhr-response-values RES
以下の値を多値で返します。
xhr-status RES
HTTP status を取得します。
xhr-status-text RES
HTTP status の文字列表現を取得します。
xhr-abort TRANSPORT

指定したリクエストを停止します。

引数には Future オブジェクト (xhr-xxx-future の戻り値)、 キャンセルオブジェクト (xhr-xxx-async の戻り値) を指定可能です。

通信を中断したなら t を返します。 既に通信が終了していたら何もせず nil を返します。

例:

;; 5 秒以内に結果が返らなければコネクションを切断して例外を投げる
(let ((future (xhr-get-future url)))
  (let ((v (xhr-future-value future :timeout 5)))
    (unless (xhr-future-completed-p future)
      (xhr-abort future)
      (plain-error "timeout"))
    v))
xhr-credential USER PASSWORD
各リクエスト関数の :basic-auth 引数に指定するための ユーザ認証用の情報を作成します。
xml-http-request-version

本ライブラリのバージョンを返します。 バージョンは major.minor.teeny という形式です。

それぞれの番号は必ず 1 桁にするので、以下のように比較することができます。

(if (string<= "1.1.0" (xml-http-request-version))
    (1.1.0 以降で有効な処理)
  (1.1.0 より前のバージョンでの処理))

4.7 MACRO

with-xhr-get-async (URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING>) &BODY HANDLER

xhr-get-async のラッパーマクロです。

マクロの本体には以下の形式でイベントハンドラを記述できます。

(on <(or HTTPステータス :success :failure :complete)> (<仮引数>...)
    <イベントハンドラの本体>)

例)

(with-xhr-get-async ("http://www.google.co.jp/" :since :epoch)
  (on 200 (res)
      (msgbox "200 OK"))
  (on :success (res)
      (msgbox "成功しました ~S" (xhr-response-header res "Server")))
  (on :failure (res)
      (msgbox "失敗しました... orz"))
  (on :complete (res)
      (msgbox "終了しました")
      (msgbox "http status: ~A" (xhr-status res))))

on の中身はクロージャに変換されるので以下のようなこともできます。

(setf result (let ((r nil))
               (with-xhr-get-async ("http://www.google.co.jp/"
                                    :key 'xhr-response-values)
                 (on :complete (text status header)
                     (setf r (list status header text))))
               #'(lambda () r)))
(funcall result)
with-xhr-head-async (URL &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING) &BODY HANDLER
xhr-head-async のラッパーマクロです。
with-xhr-post-async (URL BODY &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS ENCODING) &BODY HANDLER
xhr-post-async のラッパーマクロです。
with-xhr-request-async (METHOD URL BODY &KEY BASIC-AUTH NOMSG KEY SINCE HEADERS QUERY ENCODING) &BODY HANDLER
xhr-request-async のラッパーマクロです。

4.8 OBSOLETE FUNCTION

http-get URL &KEY HEADERS ONFAILURE ONSUCCESS ONCOMPLETE

これは互換性のために残されている 非推奨 API です。

変わりに xhr-getxhr-get-async を使ってください。

http-post URL DATA &KEY HEADERS ONFAILURE ONSUCCESS ONCOMPLETE

これは互換性のために残されている 非推奨 API です。

変わりに xhr-postxhr-post-async を使ってください。

response-text TRANSPORT

これは互換性のために残されている 非推奨 API です。

変わりに xhr-response-text を使ってください。

status TRANSPORT

これは互換性のために残されている 非推奨 API です。

変わりに xhr-status を使ってください。

status-text TRANSPORT

これは互換性のために残されている 非推奨 API です。

変わりに xhr-status-text を使ってください。

abort TRANSPORT

これは互換性のために残されている 非推奨 API です。

変わりに xhr-abort を使ってください。

all-response-headers TRANSPORT

これは互換性のために残されている 非推奨 API です。

変わりに xhr-all-response-header を使ってください。

response-header TRANSPORT HEADER

これは互換性のために残されている 非推奨 API です。

変わりに xhr-response-header を使ってください。

5 TODO

6 KNOWN BUGS

7 AUTHOR

みやむこ かつゆき (<URL:mailto:miyamuko@gmail.com>)

8 SEE ALSO

なし。

9 COPYRIGHT

xml-http-request は MIT/X ライセンスに基づいて利用可能です。

See xml-http-request/docs/MIT-LICENSE for full license.

10 NEWS

10.1 2008-07-12 / 1.2.1

xml-http-request 1.2.1 リリース!

新規機能
非互換を含む変更点
バグ修正
その他

10.2 2008-03-30 / 1.2.0

xml-http-request 1.2.0 リリース!

新規機能
非互換を含む変更点
バグ修正

10.3 2008-03-03 / 1.1.1 / ひなまつり

xml-http-request 1.1.1 リリース!

新規機能
非互換を含む変更点
バグ修正

10.4 2008-02-23 / 1.1.0

xml-http-request 1.1.0 リリース!

新規機能
非互換を含む変更点
バグ修正

10.5 2008-02-11 / 1.0.1 / 建国記念の日

xml-http-request 1.0.1 リリース!

新規機能
非互換を含む変更点
バグ修正

10.6 2008-02-11 / 1.0.0 / 建国記念の日

xml-http-request 1.0.0 リリース!

新規機能
非互換を含む変更点
バグ修正

10.7 2006-06-13 / 0.1

xml-http-request 0.1 リリース!