Sleipnir for Mac、Sleipnir Mobile for iPhone/iPad 開発担当の福井です。
今回はモバイルアプリの開発時に役に立つ、Sinatra を紹介させていただきます。
アプリを開発するとき、連携する Web API の実装がまだなくて実装を進められない、API の実装と並行してアプリを実装してはみたけど、API と連携してみると全然動かなかった、そんな経験をしたことはありませんか?Web API が完成していないけど、アプリのリリースは遅らせることができないというのはよくあるシチュエーションだと思います。そんなときは、Sinatra の導入を検討してみてはいかがでしょうか。
Sinatra とは?
Sinatra といえばフランク・シナトラ…ではなくて Ruby 製 Web アプリケーションフレームワークです。Ruby で Web アプリケーションというと Ruby on Rails を連想しがちですが、Sinatra は小ささと柔軟さが売りです。どれくらい小さいかというと、以下のコードを見てみてください。
require 'rubygems'
require 'sinatra'
get '/' do
'Fly me to the Moon!'
end
このたった7行のコードを実行するだけで簡単な Web アプリケーションがローカルにできてしまいます。もちろん iOS シミュレータや iPhone 実機からもアクセスが可能です。つまり、できるだけ手間をかけたくない/かけることのできないダミーの Web API を作るには最適のフレームワークだと言うことができます。また、Mac には標準で Ruby と RubyGems がインストールされているため、環境構築の手間がさほどかかりません。ちなみに、Sleipnir for Mac の開発チームではチーム内で使っている簡単な Web アプリケーションに Sinatra を採用しています。
Sinatra を使ってダミーの API を作る
Sinatra の詳しい導入方法については数々の有益なエントリがありますのでそちらをご覧ください。さきほどのサンプルコードからも想像していただけると思いますが、Sinatra はルートとその動作を定義することで Web アプリケーションを作る DSL です。サンプルでは‘/’の動作を定義しましたが、‘/hoge/fuga’のような定義も可能ですし、複数定義することやパターンによる定義、POST などのメソッドを使うこともできます。
アプリで使う Web API の多くは JSON や XML などのテキストを返すものでしょう。さきほどのサンプルコードを使うなら、‘Fly me to the Moon’の部分を返したい JSON や XML のテキストに変えるだけで立派なダミー API の完成です。もちろんレスポンスは動的に生成できますので、API へのパラメータを使ってより本物らしい値を生成することもできます。
Sinatra でモックを作る際に押さえておきたいこと
実際にダミーの API を作る際につまったポイントについてまとめます。
クエリパラメータを取得したい
Sinatra は Rack アプリケーションですので、以下のコードで取得できます。
p = request.env['rack.request.query_hash']
ちなみに、POST のリクエストボディは以下のように取得します。(Sinatra 公式ドキュメントより抜粋)
request.body.rewind # 既に読まれているときのため
data = JSON.parse request.body.read
"Hello #{data['name']}!"
静的ファイルを送信したい
初期設定では静的に使うファイルは Public ディレクトリに設置するとアクセスできるようになります。明示的に送信したい場合は send_file メソッドを使います。
send_file 'image.png'
リソースを設置するディレクトリは適宜変更することも可能です。
XML を送信したい
テンプレートエンジンの haml を使うのがいいでしょう。haml は主に HTML を生成するための手段として使われますが、XML も生成可能です。多くの入門記事で haml の導入方法も同時に紹介されていますので、Sinatra を学ぶうえで習得できます。また、JSON を使う場合にはこちらの gem を使うといいのではないでしょうか。hash から簡単に JSON 文字列を生成できます。
使いどころ
とにかく早く・簡単に動くものが作れますので、冒頭で示したような、Web API の実装が終わっていないケースでのモック開発に最適です。また、テスト時にテストデータを返す API としても使うことができます。開発時に API とアプリどちらにバグの原因があるのか特定が難しいパターンがありますが、問題を切り分けてバグを特定する助けになるでしょう。
Ruby 製軽量 Web アプリケーションフレームワーク Sinatra を紹介しました。いかがでしたでしょうか?Sinatra を使えば簡単な Web アプリケーションを即座に実装することができます。開発始まったけど、API が無い!なんて時に大活躍すること間違いありません。
関連
- Sinatra:Sinatra の公式ドキュメントです。これを読めばおおまかにどういうものなのか理解できるでしょう。
- Rubyist Magazine – Sinatra 再入門、 Padrino / Rack / その先の何か:Sinatraの歴史から、簡単なアプリの開発、更に進んだ内容について記載されています。
- Sinatra による Web アプリケーション開発入門:導入方法から詳しく説明されています。より詳しい内容になっていますので、Web アプリケーションを作る際の参考にもなります。