やる夫が Rack についても学ぶそうです(Rack::Request/Rack::Response編)

      / ̄ ̄ ̄\  
    / ─    ─ \  
   /  (●)  (●)  \.   Rack アプリケーションはリクエスト(Hash)を受け取って、 
   |    (__人__)    |    レスポンス(Array)を返すのはわかったお。
   \    ` ⌒´    / 
   /              \ 
     ____   
   /      \ 
  /  ─    ─\  
/    (●)  (●) \ Hash や Array だとコード書くの大変だお? 
|       (__人__)    |   
/     ∩ノ ⊃  / 
(  \ / _ノ |  | 
.\ “  /__|  |   
  \ /___ /   
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ お前にしてはもっともなことを言ったな。 
              |         }  確かに、リクエストを Hash のままで処理したり、 
              ヽ        }   レスポンス用のArrayを作成するコードは面倒になりがちだ。
            ヽ、.,__ __ノ   
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
       ____
     /_ノ ' ヽ_\
   /(≡)   (≡)\
  /::::::⌒(__人__)⌒::::: \   そんなに褒めると照れるお。
  |     |r┬-|     |
  \      `ー'´     / 
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ 褒めてないんだがな。…まあいい。 
              |         }  Rack にはリクエストやレスポンスの処理を少しだけ
              ヽ        }   楽にするクラスがある。 Rack::Request と Rack::Response だ。
            ヽ、.,__ __ノ    これらを使って先日のサンプルを書き変えると次のようになる。
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
# coding: utf-8

require "rack/request"
require "rack/response"

class SampleApp
  def call(env)
    # リクエスト(Hash)を Rack::Request でラップして、
    # 値を取り出しやすくする
    request = Rack::Request.new(env)

    # レスポンスを組み立てる
    response = Rack::Response.new do |r|
      r.status = 200
      r["Content-Type"] = "text/html"
      r.write "<html><body>#{request.request_method}</body></html>"
    end

    # 組み立てたレスポンスを
    # Rack アプリの戻り値として返す
    response.finish
  end
end
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ Rack::Request や Rack::Response に 
              |         }  どんなメソッドがあるかは、 
              ヽ        }   下記のページを参照しろ。
            ヽ、.,__ __ノ    
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|::: 
            ___
           /⌒  ⌒\      
         / (●) (●) \    リクエストからデータを取り出すのが
        /::::::⌒(__人__)⌒::::: \    メソッド呼び出しで書けたお!
        |     |r┬-|     |    レスポンスの組み立てがブロックで書けたお!
          \      `ー'´     /     
                           
            / ̄ ̄\ 
          /   _ノ  \ 
          |    ( ●)(●)  
          |     (__人__)   
             |     ` ⌒´ノ まぁ、Rails や Sinatra といった 
              |         }  Web アプリケーションフレームワークを使って開発するなら、 
              ヽ        }   Rack::Request や Rack::Response を拡張した
            ヽ、.,__ __ノ    クラスを使うことになるだろうけどな。
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! 
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::