ぼちぼちScalaで何か書こうかと思ったのですが、せっかくなのでTumblrクライアントを作ってみたいと思い ます。 今回はその小手調べということで何の認証もいらないアバター画像の取得プログラムを作りたいと思います。 かなり短いコードです。
使うライブラリは Dispatch というHTTPライブラリです。 Scalaの標準ライブラリは、コレクションライブラリは豊富なのですが、ネット関係やIO関係のライブラリはほとんどありません。 そういうのはJavaのライブラリを使えってことですね。 しかし、せっかくScalaを使うわけですから、ライブラリもScala的に使いたいと思うわけです。
で、この非常にScalaらしいDispatchというライブラリを作ったのは、n8han (Nathan Hamblen)さんという方なのですが、この人はScala界で結構な有名人です。 Scalaに貢献しているところで一番有名なのはTwitter社だと思いますが、 n8han氏を中心とするニューヨークのグループもかなりすごいです。 このDispatchやWebフレームワークのUnfilteredというライブラリ自体も評価されているのですが、 Conscript、giter8、implicit.lyの管理などによって、 Scalaライブラリのエコシステムを作ろうとしてることも注目に値すると思います。
で、そのDispatchなんですが、Scalaらしいライブラリだけあって、 Scala初学者が使おうと思うと、結構難しいものがあります。 ドキュメントはあまりしっかりしてないので、コードを読む必要があります。 このn8han氏が作るライブラリはコンビネータ的に組み合わせて使うようにできてることが多いので、 それを意識して読むといいと思います。
今回は非常に簡単なサンプルです。
ブログのアバター画像を取得するプログラムです。このブログの猫の画像ですね。 このAPIは認証の必要がないので、TumblrのAPIの中では一番シンプルなものです。
全体的なことから説明すると、これはScalaのスクリプトなんですが、 scalas(xsbtscript)という仕組みを利用しています。 sbtをConscriptでインストールすると一緒に付いてきます。 これは依存ライブラリも含めて、1ファイルに短く書けるという点では大変便利なのですが、 デバッグしづらいし、変なところでひっかかったりするしで、 既存のスクリプト言語の代替として使うのはあまりおすすめしません。 でも今回は短く書けるのでとりあえず使います。
本体部分は実質4行くらいですかね。 まず、
val http = new Http
でHttpオブジェクトを作ります。見た通りですw
val req = :/("api.tumblr.com") / "v2" / "blog" / "pab-tech.tumblr.com" / "avatar"
次にRequestオブジェクトを作ります。 Requestオブジェクトは普通のHTTPライブラリのリクエストオブジェクトと同じようなものだと思います。 リクエストに必要な情報が入ってます。 今回はURLだけですが、ヘッダ情報とかも追加できます。 URLはアバター画像を取得するAPIです。 変な見た目に見えるかもしれませんが、 Scalaではこれに限らずこういうDSLっぽい表記を使うことが多いです。
val handler = req >>> new java.io.FileOutputStream("cat.png")
次にHandlerオブジェクトを作ります。これが一番Dispatchらしいところですかね。 あらかじめレスポンスにどういう操作をするかを登録しておきます。 これをRequestと合わせて、Handlerオブジェクトにするわけです。 今回のコードは取得した画像をcat.pngというファイルに保存するという操作です。 上のRequestに対する操作もそうなんですが、色々な操作を組み合わせることができます。 その一覧がこれです。
謎の記号が多いですがw 組み合わせて使うことを意識してこういう記号になっているんだと思います。
http(handler)
で、最後にHTTPオブジェクトにHandlerオブジェクトを渡して、実際に取得するわけです。 これを実行するとcat.pngというファイルにかわいい猫の画像が保存されているはずです。
Dispatchの基本動作はこの流れです。 Requestを作り、取得したものを処理する方法を指定してHandlerオブジェクトを作り、 それをHTTPオブジェクトに渡して実際に取得するという流れです。
今回はDispatchの説明で終わった気がしますが、次回からは認証が必要なAPIも叩いていきます。