やる夫が Rack についても学ぶそうです

やる夫で学ぶ WSGI - present の続編(?)。

            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ 先日、Python の WSGI について説明した。 
              |         }  Python 以外の言語にも、WSGI みたいなものは存在する。 
              ヽ        }   たとえば Ruby なら Rack だ。
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \  <ふーん
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ (ムカッ) 
              |         }  Rack インタフェースの仕様はシンプルで、 
              ヽ        }   簡単にまとめると下の通りだ。
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
  • call メソッドを持っている
  • call メソッドは引数としてリクエストを受け取る
  • call メソッドは次の要素を含むレスポンス(Array) を返す
    • ステータスコード
    • レスポンスヘッダ(Hash)
    • レスポンスボディ(Array)
             ____
           /      \
          / ─    ─ \
        /   (●)  (●)  \   
        |      (__人__)     |    コードじゃないと分からないお
         \     ` ⌒´    ,/
 r、     r、/          ヘ
 ヽヾ 三 |:l1             ヽ
  \>ヽ/ |` }            | |
   ヘ lノ `'ソ             | |
    /´  /             |. |
    \. ィ                |  |
        |                |  |
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ (……コイツ!) 
              |         }  上記を満たす最小の Web アプリケーションを 
              ヽ        }   書くとしたらこんな感じだ。
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
# coding: utf-8
# sample_app.rb

class SampleApp
  def call(env)
    # env はハッシュ
    # HTTP リクエストの内容が格納されている
    method = env["REQUEST_METHOD"]

    # ステータスコード、レスポンスヘッダ(Hash)、レスポンスボディ(Array)
    # を入れた Array を返す
    [
      200,                                              # ステータスコード
      { "Content-Type" => "text/html" },                # レスポンスヘッダ
      [ "<html><body>#{method} です。</body></html>" ]  # レスポンスボディ
    ]
  end
end
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ これだけだと Web アプリを実行できない。 
              |         }  上記のコードを書いたファイルと同じディレクトリに、 
              ヽ        }   config.ru というファイルが必要だ。
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
# coding: utf-8
# config.ru

require './sample_app.rb'
run SampleApp.new
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ あとは config.ru があるディレクトリでrackup コマンドを実行すると、
              |         }   Web サーバーが起動して Web アプリケーションがホストされる。
              ヽ        }   
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
              _______
    :/ ̄| :  :  ./ /  #  ;,;  ヽ
  :. | ::|    /⌒  ;;#  ,;.;::⌒ : ::::\ :
    | ::|:  / -==、   '  ( ●) ..:::::|
  ,―    \   | ::::::⌒(__人__)⌒  :::::.::::| :  やる夫にも Rack よくわかったお・・・
 | ___)  ::|: ! #;;:..  l/ニニ|    .::::::/
 | ___)  ::|  ヽ.;;;//;;.;`ー‐'ォ  ..;;#:::/
 | ___)  ::|   .>;;;;::..    ..;,.;-\
 ヽ__)_/ :  /            \   ハァハァ....