Madogiwa Blog

主に技術系の学習メモに使っていきます。

Rubyで作るオレオレWebフレームワーク「第1回 Hello World 🌏」

RubyでオレオレWebフレームワークを作っているのですが、だいぶ形になってきたので知識の整理がてら色々まとめてみる✍

今回のゴール

最終的には、CRUDが動くようなアプリケーションを作れるような感じになるはずですが、 今回は下記のような実装でlocalhost:8080にアクセスした際にHello Worldがブラウザに表示出来るようなところまでを整理します🌏

まず最初の構成は下記のような形です、シンプル🐥

f:id:madogiwa0124:20190825180642p:plain

処理の流れはこんな感じです。

  1. ruby app.rbWEBrickが起動
  2. ブラウザでアクセスした際にrequestをWEBrickへ送信
  3. WEBrickへのrequestをenvとしてRackを経由してapplicationへ渡す
  4. applicationがresponse生成してRackを経由してWEBrickへ渡す
  5. WEBrickがresponseをブラウザに返却

Rackを使ってWEBrickとコードを繋ぐ 🤝

rubyのコードからWEBrickを起動するためにはRackを使います📦

Rackは、様々なWebServerへのシンプルなインターフェースを提供してくれるgemです💎

下記のルールを守ればRackを使って各種WebServerとやりとりすることが出来ます。

Rack applications A Rack application is a Ruby object (not a class) that responds to call. It takes exactly one argument, the environment and returns an Array of exactly three values: The status, the headers, and the body. https://www.rubydoc.info/github/rack/rack/master/file/SPEC

簡単に説明すると下記のような感じです。

  • callメソッドが定義されていること
  • 環境(リクエスト)を受け取る引数を一つとること
  • status、header、bodyの配列を返却すること

なので下記のようなprocオブジェクトもRackのルールを満たしており、WebServerとやりとりすることが出来ます、Rackすごい🙌

Proc.new { |env| ['200', {'Content-Type' => 'text/html'}, ["Hello World"]] }

WEBrickとRackを使ってレスポンスを返す🤟

それでは実際にruby app.rbWEBrickを起動し、Rackを使ってレスポンスHello Worldを返却するコードを見ていきましょう👀

require 'rack'

class Application
  def run!
    # Rackのルールに沿ったレスポンスを返却するコード
    app = Proc.new { |env| ['200', {'Content-Type' => 'text/html'}, ["Hello World"]] }
    # 上記コードを乗せてWEBrickを起動
    Rack::Handler::WEBrick.run app
  end
end

# ruby app.rbの処理が終了したらApplication.run!を実行する
at_exit { Application.new.run! }

先程説明したRackのルールを守ったProcオブジェクトを作成して、変数appに格納します。

そしてRack::Handler::WEBrick.runでRackを使ってWEBrickを起動します。このとき引数にappを渡すことで、リクエスト時にappに入れたProcオブジェクトが実行され、結果がレスポンスとして返却されます。

at_exitで起動用のメソッドを実行することでruby app.rbが終了したらWEBrickが定義したコードが乗った状態で起動します🤖

実際の実行結果が下記の通りです。

$ ruby app.rb 
[2019-08-25 18:02:05] INFO  WEBrick 1.4.2
[2019-08-25 18:02:05] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin18]
[2019-08-25 18:02:05] INFO  WEBrick::HTTPServer#start: pid=40353 port=8080

localhost::8080にアクセスするとHello Worldが表示されます 🙌

f:id:madogiwa0124:20190825180802p:plain

おわりに

今回はRackを使ってWEBrickを起動し、Hello Worldをレスポンスとして返すところまでの実装を整理してみました✍
シンプルなルールに沿っていれば簡単に様々なWebServerとやりとり出来るRackという仕組みは分かりやすいし、とても便利ですね💎

次回はHTTP METHOD/URLと実行するロジックを紐付けるroutingの仕組みを整理していこうかなと思っています🛣

参考

github.com

qiita.com