SILVER HAIRED LISP (自作Lisp)のHTTPクライアント機能
本LispのHTTPクライアント機能は、本物のCommon Lispのライブラリである Dexador (dex) と、クッキー管理を行う Cookiejar を真似た書き方が出来るようにしています。
本物のcommon lispの場合
SBCLのようなquicklispが使える環境では、以下のような書き方をするそうです。
(ql:quickload '(:dexador :cookiejar))
(let* (;; クッキーを保持するjarオブジェクトを作成
(jar (cookiejar:make-cookie-jar))
;; テスト用のエンドポイント
(url-set "https://httpbin.org/cookies/set?my_cookie=hello_dexador")
(url-get "https://httpbin.org/cookies"))
(format t "--- 1. クッキーを設定するリクエストを送信 ---~%")
;; :cookie-jar に作成した jar を指定します
(multiple-value-bind (body status headers uri stream)
(dex:get url-set :cookie-jar jar)
(declare (ignore headers uri stream))
(format t "Status: ~A~%" status)
(format t "Body: ~A~%~%" body))
上記のプログラムは、
Common LispのHTTPクライアントライブラリである Dexador (dex) と、クッキー管理を行う Cookiejar を組み合わせて、Cookieを保存・送信しながら HTTP GET リクエストを行っています。
本 Lispは、quick lispを動かす事はあきらめています。
本LispのHttpクライアント
本Lispはquicklispをサポートしていないので、q:quickloadは不要です。
Lispインタープリタを起動した時点で、dexador, cookiejar相当が使える状態です。
ただし、2つのパッケージを切り替えて使うのが面倒だったので、両方とも dexに入れてしまいました。
(defvar *url* "https://test-yourdomain.com/xx/Test2026")
(let ((cookie-jar (dex:make-cookie-jar) ))
(dex:get *url*
:headers '(("Authorization" . "Bearer your-token-here") ("X-Custom-Header" . "CustomValue")
("user-agent" . "Mozilla/5.0 (Windows NT 10.0) AppleWebkit/537.36") )
:cookie-jar cookie-jar)
)
defvarで定義している *url* は、ご自分のテストしたいエンドポイントに書き替えてください。
最初のgetで受け取った cookieを、次のpostに渡す例
*url*は先ほど、定義したのを使っています。
(let ((cookie-jar (dex:make-cookie-jar) ))
(dex:get *url*
:headers '(("Authorization" . "Bearer your-token-here") ("X-Custom-Header" . "CustomValue")
("user-agent" . "Mozilla/5.0 (Windows NT 10.0) AppleWebkit/537.36") )
:cookie-jar cookie-jar)
(dex:post *url*
:headers '(("Content-Type" . "application/json")
("Authorization" . "Bearer your-token"))
:content "{\"name\": \"lisp\", \"version\": 25}"
:cookie-jar cookie-jar)
)
説明
最初の getをした時に、サーバーからレスポンスで、クッキーが返ってきたとします。
その内容は、 cookie-jarの中にある変数に記録されます。
2回目の postをする時の最後の行に :cookie-jar cookie-jar を指定しています。
postする時には、getで受け取ったクッキーを再度おくります。
getの多値を参照する
本物の CL同様に、getの結果は、multiple-value-bindで、受け取る事ができます。
(let ((cookie-jar (dex:make-cookie-jar) ))
(dex:get *url*
:headers '(("Authorization" . "Bearer your-token-here") ("X-Custom-Header" . "CustomValue")
("user-agent" . "Mozilla/5.0 (Windows NT 10.0) AppleWebkit/537.36") )
:cookie-jar cookie-jar)
(multiple-value-bind (body status headers)
(dex:put *url*
:headers '(("Content-Type" . "application/json")
("Authorization" . "Bearer your-token"))
:content "{\"name\": \"lisp\", \"version\": 25}"
:cookie-jar cookie-jar
)
(format t "statuc ~S" status)
(format t "headers ~S" headers)
)
)
クッキーの中身を参照する
(let ((cookie-jar (dex:make-cookie-jar) ))
(dex:get *url*
:headers '(("Authorization" . "Bearer your-token-here") ("X-Custom-Header" . "CustomValue")
("user-agent" . "Mozilla/5.0 (Windows NT 10.0) AppleWebkit/537.36") )
:cookie-jar cookie-jar)
(dolist (c (dex:cookie-jar-cookies cookie-jar))
(format t "name: ~A, value: ~A, domain: ~A, path: ~A~%"
(dex:cookie-name c)
(dex:cookie-value c)
(dex:cookie-domain c)
(dex:cookie-path c)
))
)