RESTの本よんだ

脳みそレンタル業(あるいは派遣SE業)が終息にむかいつつあるので、空いた脳みそで読書を再開したよ。読んでて思いついたことをメモ。

『Webを支える技術 - HTTP、URI、HTML、そしてREST』


教科書としてとてもよい本だった。Web系の知識は仕事のために必要に駆られて覚えた内容が多いんだけど、体系的に勉強していたわけではないので、この本はよい復習になった。8割が既知の内容でも、それを体系的に整理しなおせることと、残りの2割を補足できることのお蔭で全体を網羅的に知ることが出来るのは大きい。


「クールなURI」については、この本を読むまで誤解していた。パラメータを忌避してPATHで表現するのがカッコいいとか、見栄えが良い悪いとか、の話ではない。*1「変わらないURIこそが、クールなURIなのです。」という言葉が全てだ。それ以外のこと(言語・プログラムに依存しない、名詞である、等)はそれを実現する為の手段でしかない。むしろ、統一インタフェースとアドレス可能性と接続性があれば、個別のURIの見栄えなどは気にしなくても良いはず。


検索結果をリソースと考える場合、検索条件には「リソースを構成する要素」と「リソースの見せ方を一時的に変える要素」の二種類があるように思う。カテゴリーなどは前者、キーワードやページ番号は後者にあたる。そのリソースにPOSTした際に初期値を構成するようなものが前者、という風に考える。※あとで整理する

JavaによるRESTfulシステム構築』


評判に違わず面白い本だった。今風のJavaのプログラミングスタイルがてんこ盛りなので、普通に中級向けのJavaプログラミングの本としても勉強になると思う。Builderで流れるようなインタフェースとかは数年後に見たらニヤニヤできるかも知れないけど。第二部のサンプルコードも、いろいろ工夫やアイデアが含まれているので、おまけと思って飛ばさずに読むと良いかも。


JAX-RS(RESTeasy)は、アプリケーションを作る時にプログラムとして書くことはシンプルだし、その為の道具はとても充実しているので、すぐに使い出すのに十分に実用的だと思う。Webに共通の、条件付GETとか認証とかコンテントネゴシエーションとかも、仕様として用意されているのはかなり助かると思う。自分で実装すると意外に面倒なので。


JAX-RS(RESTeasy)リソース指向のWebAPIを書くためのフレームワークではあるのだけれど、中身がリソース指向的になるかという話とはすこし別だと思う。何かリソース的なものを一箇所で定義しておけばCRUDは自動でできますよ、というような仕組みにはなっていない。(サンプルコードを見ても割とベタに書いている。) でも仮にそういうそういう仕組みを作るとしても、JAX-RSを土台として利用することは可能だと思う。


たとえば、URIとリソースの間の自然なマッピングがあって、サーバメモリ上のオブジェクトグラフが自然に画面遷移を作るような風に作れると楽だと思う。UriBuilder.fromResource()はそういうアイデアを実装するのを助けてくれそうだ。


"http://example.com/customers/333"というURIでid=333の顧客情報を取得するためのリソースクラスは下のようになる。(『JavaによるRESTfulシステム構築』(オライリー・ジャパン刊) p.134)

@Path("/customers")
public class CustomerService {
   @Path("{id}")
   public Customer getCustomer(@PathParam("id") int id) {...}
}

他のリソースクラスがCustomerへの参照を持っていたとして、そのリソースがレスポンスを返す時にCustomerへのリンクを出力したい場合は、UriBuilder.fromResource()を使って以下の様に書けるらしい。(同書 p.134)

UriBuilder builder = UriBuilder.fromResource(CustomerService.class);
builder.host("{hostname}");
builder.path(CustomerService.class, "getCustomer");

これで"http://{hostname}/customers/{id}"というURIテンプレートが作れるので、build()メソッドを使って個々のCustomerのIDに対応するURIが生成できる。DRYでとても素敵。


そういうところまでフレームワーク化しないのはJava文化圏のミニマリズムなのかも知れん。

*1:そういう主張だと思って軽く見ていた