前回の続きです。
今回は大量のダミーデータを返すAPIを作ってみます。
要件としては
- 住所録を返すAPI
- 本番サーバはPHPなので、URLもそれに合わせる
- 100件程度、ランダムで返す
- XMLの内容は、名前、メール、メッセージ、性別、国
という感じです。
Haml
今回はテンプレート言語にHamlを使っていきます。
タグ構造をインデントと簡略構文でガシガシ書いていけるので、慣れると気持ちいいです。
日本Hamlの会
http://haml.ursm.jp/
Getting Started Haml
http://haml.ursm.jp/getting-started
ざっくりと説明すると
%items
%item(id="1") こんにちは
%item(id="2") さようなら
というHamlマークアップが
<items>
<item id="1">こんにちは</item>
<item id="2">さようなら</item>
</items>
に変換されます。
雰囲気だけ掴んでもらって、詳しくはチュートリアルやドキュメントを御覧下さい。
Forgeryでサンプルデータの作成から解放される
forgeryというgemライブラリで、煩瑣なサンプルデータ作成とはおさらばできる。
でインストールして、使い方は
puts Forgery(:internet).email_address #=> tmccoy@topiclounge.biz
puts Forgery(:internet).email_address #=> charper@voolia.net
こんな感じ。標準でサンプルデータの辞書がいろいろ入っていて、上記のコードはメールアドレスのサンプルデータをランダムに生成している。
今回はForgeryを積極的に使う。
コード
いきなりですが最終型のコード
require 'sinatra'
require 'forgery'
before do
content_type 'xml' # 常にContent-Typeを 'application/xml'に
end
get '/api/getFriends.php' do
haml :get_friends_php
end
__END__
@@ layout
!!! XML
= yield
@@ get_friends_php
%friends
- rand(100).times do |i|
%friend(id="#{i}")
%name
%first_name= Forgery(:name).first_name
%last_name= Forgery(:name).last_name
%email= Forgery(:internet).email_address
%message= Forgery(:lorem_ipsum).paragraph
%gender= Forgery(:personal).gender
%country= Forgery(:address).country
今回は1ファイルで完結させてみた。
ブラウザで http://localhost:9393/api/getFriends.php (ポートはshotgunデフォルト)にアクセスすると、下みたいなXMLが取得できる。
beforeフィルター
常にXMLを返すAPIなので、リクエストを受け付けて処理する前にContent-Typeを’application/xml’にするように設定。Sinatraのbeforeフィルターという機能で実現。
content_type 'xml' # 常にContent-Typeを 'application/xml'に
end
URLに対する処理
/api/getFriends.phpというパスに対して処理したい場合、Sinatraのgetメソッドに続いて、そのパスを定義する。 do ~ end ブロックの中に処理を記述。
この場合Hamlでget_friends_phpテンプレートを出力する処理のみだね。
パスに普通に「.php」とか使えているところに注目してもらいたい。要するにマッチすればなんでも良いので「.pl」でも「.cgi」でも「.do」でも本番と同じパスを表現できるはずだ。
haml :get_friends_php
end
Hamlによるテンプレート
Sinatraには「ファイル内テンプレート」という機能があって、テンプレートをわざわざ別ファイルとして用意しなくても、ソースファイルの最後(END以降)に テンプレートを書いても良いことになっている。
テンプレート名は「@@index」とか「@@layout」とか先頭に「@@」を付けて置くこと。
@@ layout
!!! XML
= yield
@@ get_friends_php
%friends
- rand(100).times do |i|
%friend(id="#{i}")
%name
%first_name= Forgery(:name).first_name
%last_name= Forgery(:name).last_name
%email= Forgery(:internet).email_address
%message= Forgery(:lorem_ipsum).paragraph
%gender= Forgery(:personal).gender
%country= Forgery(:address).country
レイアウト
layout という名前のテンプレートがあれば、Sinatraはすべてのテンプレートのレイアウト、つまり枠として利用する。
「!!! XML」はXMLのドキュタイプ宣言を簡略表現で、「= yield」は、ここにメインテンプレートの内容を流し込むよーという処理。
get_friends_php テンプレート
%friends
- rand(100).times do |i|
%friend(id="#{i}")
%name
%first_name= Forgery(:name).first_name
%last_name= Forgery(:name).last_name
%email= Forgery(:internet).email_address
%message= Forgery(:lorem_ipsum).paragraph
%gender= Forgery(:personal).gender
%country= Forgery(:address).country
XMLのタグ表現を「%タグ名」とインデント階層でマークアップしていく。
「- rand(100).times do |i|」は、以降の下層インデントの部分をランダムで100件まで繰り返させている。
あとはForgeryの住所辞書や名前辞書を使ってサンプルデータを埋め込むよ。
さいごに
今回はFlashで使えそうな大量のダミーデータAPIをさくっと作ってみたよ。慣れれば10分もあれば作れるので、下手に実データを作るより楽なはず。
今後は
- HTTP POSTでデータを送信するような場合
- JSONの場合
など書いてみようかと。