thin(Rack)アプリを作ってみる


thinはRackという規格で、各種フレームワークのアプリケーションサーバになるようですが、どうやらフレームワークを使わなくても書こうと思えば書けるようなので、まずはシンプルにthin(Rack)のアプリケーションを書いてみます。


第23回 Rackとは何か(1)Rackの生まれた背景:Ruby Freaks Lounge|gihyo.jp … 技術評論社」を読むと、Rackアプリケーションとして最低限必要な事が挙げられていました。
・callというメソッドを持っていること
・callメソッドの引数としてWebサーバからのリクエストを受けること
・callメソッドは,次の要素を含むレスポンスを返すること
  ・ステータスコード
  ・レスポンスヘッダ(Hash)
  ・レスポンスボディ(Array)
そういえば、「Ruby製webサーバthinのインストール」で出てきた「fart.ru」のアプリは、callメソッドはないけど、ステータスコード、レスポンスヘッダ、レスポンスボディの配列を返してました。

第23回 Rackとは何か(1)Rackの生まれた背景:Ruby Freaks Lounge|gihyo.jp … 技術評論社」を見ながら、リンク先のサンプルより更に簡単なサンプルを作成してみました。

simpleapp01.rb

# coding: utf-8
 
class SimpleApp01
  def call(env)
    [
      200,
      {'Content-Type' => 'text/html'},
      ['<html><body>ハローthin(Rack)!!</body></html>']
    ]
  end
end
  • シンプルにステータスコード200と、htmlテキストだと示すヘッダ、html本文だけを返すサンプルです。

simple01.ru

# coding: utf-8
 
require 'simpleapp01.rb'
run SimpleApp01.new
  • こちらもシンプルに、「SimpleApp01」クラスを実行するだけのruファイルです。


これらを2つとも「C:\thin」に配置して、thinを実行します。
c:\thin>thin start -R simple01.ru
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop
 

そして、「http://localhost:3000」にアクセスすると、「ハローthin(Rack)!!」が表示されました!



URLごとに別々のクラスを実行+画像表示

「simple01.ru」だと、URLを色々変えてみても常に「ハローthin(Rack)!!」だったので、URLごとに別々のクラスを実行してみましょう。
Route 477 - Rack日本語リファレンス」今回はここがすごく参考になります。

simpleapp02.rb

# coding: utf-8
 
class SimpleApp02
  def call(env)
    [
      200,
      {'Content-Type' => 'text/html'},
      ['<html><body><a href="/"><img src="/img/1179_64.png"/></a></body></html>']
    ]
  end
end
 
  • 2つ目のクラスは「/img/1179_64.png」を使って画像つき戻るリンクを表示するだけのサンプルです。
  • 画像を表示するために、ruファイルの方にもう一工夫必要になります。
  • 画像はこちら(Free Must Have Windows 7 Icons from VisualPharmのサイトの素材を利用させて頂きました。

simple02.ru

# coding: utf-8
 
require 'simpleapp01.rb'
require 'simpleapp02.rb'
require 'rack/static'
 
use Rack::Static, :urls => ["/img"]
 
map "/" do
  run SimpleApp01.new
end
 
map "/foo" do
  run SimpleApp02.new
end
 
  • ruファイルには、「map "/" do ~ end」で最初に作った「SampleApp01」を実行
  • 「map "/foo" do ~ end」で新しく作った「SampleApp02」を実行しています。
  • 更に、「use Rack::Static, :urls => ["/img"]」を追加して、「/img」ディレクトリの中の画像ファイルを表示出来るようにしてあります。
    • カンマ区切りで、"/css"や"/js"等を追加することも出来るみたいです。

準備が出来たらthinを実行します。
c:\thin>thin start -R simple02.ru
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop
 

そして、「http://localhost:3000/foo」にアクセスしてみると「SimpleApp02」が実行されて、ちゃんと画像が表示されました。

画像をクリックして、「http://localhost:3000/」に戻ると「SimpleApp02」が実行されて「ハローthin(Rack)!!」が表示されます。

コメント

名前: