コンテンツ 表示]

前口上 編集

Common Lisp で RESTafarians を目指そうというものです。 ほしいのは自由なんです。

業務系アプリの開発/運用に携わっていますがアプリケーション構成が複雑です。 アプリケーション、Webサービス、Linux、Windows、Network、Database、メーラー、グループウェア、ジョブスケジューラ とデスクトップはウインドウだらけ。 追い討ちをかけるかの如きRACやHA構成、開発環境/ステージング環境/本番環境など多くの環境。

今や業務系アプリの世界は人知や人体の限界を越えたものになりつつあります。 複雑な構造の石畳の下に敷き詰められている無数の砂、それは奴隷と化したITトビ職たち。

そんな中必要とされているのは開放なんです。 そのための統一のインターフェースなんです。 そのための技術なんです。 それにはRESTfulが最適ではなかと思うのです。 シンプルですし HTTPリクエストとXMLは今やこの二つはどこにでもあります。 MS Officeにもついています。環境としては抜群ではないでしょうか。

ほしいものが、ほしいときに、手に馴染んでいるツールで手に入る。そんな素敵な環境が構築できる足掛りになればと思います。

これらは MS Windows で実現できなければ意味がないと考えています。 大くの奴隷は MS Windows という手枷 がついているからです。 いや、弱っちいだけなんです。スミマセン。。。









始めるまえに 編集

まずは REST(Wikipedia)で RESTFulについて理解しましょう。 次に HTTP についての理解を深めましょう。 HTTPについて理解したいなら Studying HTTP がオススメです。 Introduction of HTTP - REST でRESUTful についての説明もあります。









HTTP のクライアントとサーバー 編集

HTTP サーバー/クライアントは drakma と hunchentoot を利用します。

+-------------+ http request +-------------+ | HTTP client | ---------------> | HTTP server | +-------------+ +-------------+ | drakma | <--------------- | hunchentoot | +-------------+ http responce +-------------+ content by XML | | +-user object-+ V | Hash table | +- database --+ +-------------+ | Hash table | | id | +-------------+ | name | | id | | description | | user object | -------> | create-time | +-------------+ +-------------+



利用するライブラリです。

place library description server hunchentoot HTTP サーバーです。 cl-who S式を HTML に変換してくれます。 cl-ppcre Perlの正規表現を実現してくれます。 cl-interpol 正規表現を普通の書式で受け付けてくれます。cl-ppcreはS式で書く必要があるので。 clsql, clsql-mysql, clsql-oracle データベースへのアクセスは clsql を利用します。とりあえず mysql と oracle にアクセス出来れば良いかな、と。 client drakma HTTP クライアントです。 url-rewrite URL をいい感じに変換してくれます。 共通 Closure XML MS office との連携も考えると XML でレスポンスを返します。









RESTful の設計 編集

RESTful サービスを設計します。

リソースの基本情報

項目 内容 データセット ユーザー リソース 架空のRESTfulサービスを提供しているサイト「www.cl-restful.com」のユーザーをリソースとします。 URI 単体：/user/{user-id} このURIはUser単体の作成/照会/変更/削除 の機能を持ちます。

複数：/users?id=XXX&name=XXX このURIはUserの一覧を取得するのみです。



リソースの操作

HTTP メソッド 処理内容 GET ユーザー情報の取得 PUT ユーザーの作成 POST ユーザー情報の変更 PUT ユーザーの削除









実装 編集

サーバー側 編集

パスパラメータとクエリパラメータ 編集

URI の一部をパラメータとして利用する機能（パスパラメータ）は hunchentoot にはありません。 自分で構築する必要があります。今回は こちら を拝借します。(感謝)

この URL の内容だとクエリパラメータが取得できないので、クエリパラメータを第一引数で渡すことにします。 あれ？でもこれ METHOD:GET だけなのかな。。。

(defun create-regex-dispatcher (regex page-function) (let ((scanner (cl-ppcre:create-scanner regex))) (lambda (request) (multiple-value-bind (whole-match matched-registers) (cl-ppcre:scan-to-strings scanner (tbnl:script-name request)) (when whole-match (lambda () (apply page-function (tbnl:get-parameters* request) (coerce matched-registers 'list))))))))



よって function : page-function は下記のようになります。

page-function qurey-parameters &optional path-parameter => nil



page-function のテストサンプルです。

(defun sample-page-function ( query-param &optional path-param) (format nil "~A, ~A" query-param path-param))



sample-page-function を *dispatch-table* に登録します。 URI と page-functionを関連付けます。

(push (create-regex-dispatcher "^/user/(\\d*)" #'resource-function) tbnl:*dispatch-table*)



http://127.0.0.1:4242/user/999?name=hanage にアクセスすると各パラメータの内容が表示されます。

クライアント側 編集

http-request によるリクエストの送信 編集