Quantcast
Channel: func09 » ruby
Viewing all articles
Browse latest Browse all 10

[sinatra for flasher] 大量のダミーデータを返すAPIを作る

0
0

FLASHer のためのSinatra入門 [導入編]

前回の続きです。

今回は大量のダミーデータを返すAPIを作ってみます。
要件としては

  • 住所録を返すAPI
  • 本番サーバはPHPなので、URLもそれに合わせる
  • 100件程度、ランダムで返す
  • XMLの内容は、名前、メール、メッセージ、性別、国

という感じです。

Haml

今回はテンプレート言語にHamlを使っていきます。
タグ構造をインデントと簡略構文でガシガシ書いていけるので、慣れると気持ちいいです。

日本Hamlの会
http://haml.ursm.jp/

Getting Started Haml
http://haml.ursm.jp/getting-started

ざっくりと説明すると

!!! XML
%items
  %item(id="1") こんにちは
  %item(id="2") さようなら

というHamlマークアップが

<?xml version='1.0' encoding='utf-8' ?>
<items>
  <item id="1">こんにちは</item>
  <item id="2">さようなら</item>
</items>

に変換されます。
雰囲気だけ掴んでもらって、詳しくはチュートリアルドキュメントを御覧下さい。

Forgeryでサンプルデータの作成から解放される

forgeryというgemライブラリで、煩瑣なサンプルデータ作成とはおさらばできる。

sudo gem install forgery

でインストールして、使い方は

require 'forgery'
puts Forgery(:internet).email_address #=> tmccoy@topiclounge.biz
puts Forgery(:internet).email_address #=> charper@voolia.net

こんな感じ。標準でサンプルデータの辞書がいろいろ入っていて、上記のコードはメールアドレスのサンプルデータをランダムに生成している。

今回はForgeryを積極的に使う。

コード

いきなりですが最終型のコード

require 'rubygems'
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フィルターという機能で実現。

before do
  content_type 'xml' # 常にContent-Typeを 'application/xml'に
end

URLに対する処理

/api/getFriends.phpというパスに対して処理したい場合、Sinatraのgetメソッドに続いて、そのパスを定義する。 do ~ end ブロックの中に処理を記述。

この場合Hamlでget_friends_phpテンプレートを出力する処理のみだね。

パスに普通に「.php」とか使えているところに注目してもらいたい。要するにマッチすればなんでも良いので「.pl」でも「.cgi」でも「.do」でも本番と同じパスを表現できるはずだ。

get '/api/getFriends.php' do
  haml :get_friends_php
end

Hamlによるテンプレート

Sinatraには「ファイル内テンプレート」という機能があって、テンプレートをわざわざ別ファイルとして用意しなくても、ソースファイルの最後(END以降)に テンプレートを書いても良いことになっている。

テンプレート名は「@@index」とか「@@layout」とか先頭に「@@」を付けて置くこと。

__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

レイアウト

layout という名前のテンプレートがあれば、Sinatraはすべてのテンプレートのレイアウト、つまり枠として利用する。

「!!! XML」はXMLのドキュタイプ宣言を簡略表現で、「= yield」は、ここにメインテンプレートの内容を流し込むよーという処理。

get_friends_php テンプレート

@@ 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の場合

など書いてみようかと。


Viewing all articles
Browse latest Browse all 10

Latest Images

Trending Articles





Latest Images