RESTWiki
REST APIを使い、表示、新規作成、編集、削除を行えるwikiを作ってみた。とは云うのも、先日のPofEAA読書会の時に高橋メソッドの高橋さんとRailsでREST実現するには、という話をしていて気になったのでさくっと実装。 http://rails2u.com:8008/rest/名前 というURIに対してHTTPのGET,POST,PUT,DELETEメソッドを送ると表示、作成、編集、削除するという簡単な機能の物を作ったんだけど、それだけじゃつまらないんでフロントエンドとしてxmlhttprequestを使って各種操作が行えるインターフェイスも付けてWikiっぽくした。
RailsでのREST実装は最初、僕らにはコレ系のwebservice apiを簡単に扱えるActionWebService(railsの主要ライブラリの一つ)があるじゃないか!ということでActionWebServiceの中身を覗いてみると、RESTの実装されてなくてTODOには
Add :rest dispatching mode
とか書いてあるし、うわーんp−q。というわけで自前実装。といってもAtomPPなどを使った高度な物ではなく、テキストでやりとりするだけの仕組みなのであっという間に実装完了。requestのインスタンスメソッドのmethod?でHTTPのどのメソッドか判断できるのでそれで処理振り分けるだけだし。デバッグ時、PUTやDELETEメソッドの送信にはwfetchっていうMS謹製のソフトウェアを使いチェック。http://rails2u.com:8008/rest/foobar なんかに実際にPUTとかDELETEを送ってみるときちんと動いてることが解るハズ。
インターフェイス部分の実装は、prototype.jsのAjax機能を使った。送るメソッドを指定できるので楽なんだけど、一部putを意識してない部分があったのでそこらへんはちょこっと弄った。
処理はxmlhttprequestのステータスコードによって振り分けを行っている。たとえばページ表示時に最初GETでデータを取ってくるのだけど、404が返った場合はエラーメッセージを出して新規作成のリンクを張ったり、存在するデータにPOSTした場合は500が返るのでエラーを表示とか。あれ、この場合403の方がいいのかな…。ていうかJavaScript部の実装は非常に汚いコードなのでオレヤバスp−q。
最後に公開しようとlighttpdの設定行ってたらオレが使ってる1.3.13だと501が返ってくるんですけど!PUTとDELETEメソッドが実装されて無いんですけど!で、1.4.3落としてソースみたら実装されてるっぽいのでコンパイルして動かしてみるとやっぱりオレの環境じゃ1.3.14以降だと暴走するよ…。PUTメソッドの挙動もおかしいし。ってことをぼやいたらポロシャツ反対で着ていた人に「lighttpd + fastcgi + catalyst + AtomPPぷらぎんでPUT正常に拾えてるよ」と云われたので環境依存な気も…。そんなこんなで仕方なくwebrickをdaemon modeでport8008で動かしてたり…。
ソースコードは http://rails2u.com/misc/restwiki_0.1.tar.gz に置いてあるので見たい人はどうぞ。ライセンスは修正BSDライセンスです。