Scotty + Aeson + Persistentで作るJSON Web API
株式会社Aiming 藤村大介
@ Yesod勉強会第2回, 2012-07-07
自己紹介

• 藤村大介

• http://fujimuradaisuke.com @ffu_
• 株式会社Aiming所属

• Haskell好きのRuby on Railsプログラマー

• 最近はJavaScript/CoffeeScriptもよく書いている

• アジアの料理とアメリカのビール、アルザスのワインが好き

• ラテンアメリカ文学も好き
ところで、なぜ今JSON Web APIなのか

• なんだか最近JSON Web APIを作る機会が多い

• 一つのアプリケーションを複数クライアントで動かす事例が増えてきた

• Mobile, PC, iOS/Android Native全部に展開とか

• フロントエンドでUIを構築する技術の発達・浸透

• クライアント・サーバーの分業は進みそう
突然ですがYesodはいまいちだと思う

• 最近Webデザイン/フロントエンド開発が一段と難しくなってきた気がする

• なのでクライアント/サーバーで分業ができないと厳しい

• みなさんHamletとCassiusでプロダクションレベルのレスポンシブなマーク
  アップできますか?


• ようやくsass/lessが浸透してきたのにまた新しい技術を…

• しかもほとんど一緒だし…

• Web APIとして使うとなるとフルスタックの度が過ぎる

• なぜ使う予定のない認証ライブラリのインストールを求められるのか
そこでWeb APIはscottyで作ろうではないか

• Web API作りはDBアクセスとルーティングさえできれば基本OK

• 例えばRubyだとWeb API作る時Railsではなくsinatraってのはよくある

• ライブラリの依存関係は少ないほうが何かと幸せ

• DBはpersistent、JSONはaesonでやってみよう
scottyについて

• RubyのsinatraインスパイアのWeb Application Framework

• https://github.com/xich/scotty/
• シンプルなAPI

• Yesodと同じくwaiベース
aesonについて

• Real World Haskellの著者、Bryan O'Sullivanさんの作ったJSONライブラリ

• https://github.com/bos/aeson
• まるでJSONのような構文で書けるDSL(?)が大変便利

• 速いらしい
persistentについて

• ご存知Yesod同梱のORM

• (しかし、”Object”にマッピングされてる気配は全く無い)


• http://www.yesodweb.com/book/persistent
• PostgreSQL, SQLite, MongoDB, MySQLに対応

• QuasiQuoteでテーブル定義、マイグレーションもある

• 型チェック付きのSQLって感じで使いやすい
できました

• 結論から言うととても幸せな組み合わせでした
persistentとaesonの相性がすばらしかった(1)

• テーブル定義したら、それをToJSON/FromJSONのインスタンスにする
persistentとaesonの相性がすばらしかった(2)

• すると、DBの行をJSONとして扱える(ToJSONのインスタンスになるので)

• なので、scottyでそのままJSONレスポンスとして返せる
persistentとaesonの相性がすばらしかった(3)

• 今度はテーブルと同じスキーマのJSONをPOSTすると、

• そのまま行としてDBに入れられる(FromJSONの行として受け取れるから)
これはかなりエレガントなのでは

• この記述量でDBからの取得/DBへの追加ができます

• すごい!
キラーライブラリの予感

• 依存関係が少ないのでコンパイルも楽

• 型クラスを活かせる

• Web APIならHaskellでもクライアント開発との協働も問題なし

• むしろランタイムエラーが無いのでクライアント開発は幸せ
余談

• ちなみに位置情報系のWebサービスを作ろうとしてました

• クライアントはBackbone.js, CoffeeScript、Google Mapsあたりを利用

• 実際のところ、クライアントのコードを書いてる方が長かった…

• HTMLテンプレートはmustacheを使った。これも良かった

• まだ複雑なことをやってないので、落とし穴がありそう

• 認証まわりはまだ未着手。落とし穴はここか…?

• Template Haskellを使ったらToJSON/FromJSONにするのも自動でできそうな
 気が…
おわり

• ご清聴ありがとうございました!

Scotty + Aeson + Persistentで作るJSON Web API