0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SILVER HAIRED LISP (自作Lisp)のHTTPクライアント機能

0
Posted at

SILVER HAIRED LISP (自作Lisp)のHTTPクライアント機能

本LispのHTTPクライアント機能は、本物のCommon Lispのライブラリである Dexador (dex) と、クッキー管理を行う Cookiejar を真似た書き方が出来るようにしています。

本物のcommon lispの場合

SBCLのようなquicklispが使える環境では、以下のような書き方をするそうです。

本物のcommon lispの場合
(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)
            ))
)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?