0Pricing
Ruby Academy · レッスン

ミドルウェアと Rack

Rack スタックです。

「ミドルウェアと Rack」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

Rackとは

Rackは、RubyのWebサーバーとフレームワークの間にある最小限のインターフェースです。SinatraやRailsなどはすべてRack上で動作します。

  • リクエストとレスポンスの流れを標準化します
  • 再利用可能なミドルウェアを利用できます
  • Rackアプリとは、call(env)に応答するものです
app = lambda do |env|
  [200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end

puts app.call({}).inspect

Rackの契約

Rackアプリのcallは、3要素の配列を返す必要があります。

  • Status整数(例:200)
  • Headersハッシュ
  • Bodyeachに応答するもの(通常は文字列の配列)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }

envハッシュ

env引数は、リクエストを表すハッシュです。

  • REQUEST_METHODにはGETやPOSTなどが入ります
  • PATH_INFOはリクエストされたパスです
  • QUERY_STRINGはクエリパラメーターの生の文字列です
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"

ミドルウェアとは

ミドルウェアはアプリをラップし、リクエストがアプリに到達する前後に処理を追加します。

  • ロギング、認証、圧縮などに使います
  • 各ミドルウェアもcall(env)に応答します
  • チェーン内の次のアプリを呼び出します
class Logger
  def initialize(app)
    @app = app
  end

  def call(env)
    puts "Request: #{env['PATH_INFO']}"
    @app.call(env)
  end
end

ミドルウェアクラスを構築する

ミドルウェアはラップしたアプリを保持し、callで処理を委譲します。

  • コンストラクターで内部のアプリを受け取ります
  • callでenvを変更してから処理を転送できます
  • 戻り際にレスポンスを変更することもできます
class UpcaseBody
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    new_body = body.map(&:upcase)
    [status, headers, new_body]
  end
end

puts 'Middleware defined'

ミドルウェアスタック

ミドルウェアはスタックを形成します。リクエストはアプリへ下っていき、レスポンスは上へ戻ってきます。

  • 外側のミドルウェアは、入ってくる途中で最初に実行されます
  • 外側のミドルウェアは、戻ってくる途中で最後に実行されます
inner = lambda { |env| [200, {}, ['core']] }

class Wrap
  def initialize(app); @app = app; end
  def call(env)
    s, h, b = @app.call(env)
    [s, h, b.map { |x| "[#{x}]" }]
  end
end

puts Wrap.new(inner).call({}).last.inspect

Sinatraでミドルウェアを使う

useを使ってSinatraアプリにミドルウェアを追加します。

  • use Rack::Logger
  • useの呼び出し順でスタックの順序が決まります
require 'sinatra'

use Rack::Logger

get '/' do
  'Logged request'
end

config.ruとrackup

config.ruファイルは、rackupまたはPumaでRackアプリを起動します。

  • runで最終的なアプリを設定します
  • useでその前にミドルウェアを追加します
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Application

よく使う組み込みミドルウェア

Rackには便利なミドルウェアが付属しています。

  • Rack::CommonLoggerはリクエストをログに記録します
  • Rack::Deflaterはgzip圧縮を行います
  • Rack::Staticはファイルを配信します
  • Rack::Session::Cookieはセッションを管理します
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'

レスポンスを変更する

ミドルウェアは、内部のアプリが実行された後にレスポンスヘッダーを追加することがよくあります。

  • レスポンスの3要素を受け取ります
  • ヘッダーを変更してから返します
class AddHeader
  def initialize(app); @app = app; end
  def call(env)
    status, headers, body = @app.call(env)
    headers['X-Powered-By'] = 'Ruby'
    [status, headers, body]
  end
end

app = AddHeader.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[1].inspect

リクエストをショートサーキットする

ミドルウェアは、内部のアプリを呼び出さずにリクエストを停止できます。

  • 認証ゲートやレート制限に便利です
  • レスポンスの3要素を直接返します
class Auth
  def initialize(app); @app = app; end
  def call(env)
    return [401, {}, ['Unauthorized']] unless env['token']
    @app.call(env)
  end
end

app = Auth.new(lambda { |e| [200, {}, ['ok']] })
puts app.call({})[0]

理解度チェック

Rackについての理解度を確認しましょう。

まとめ

Rackスタックについて学びました。

  • RackはRubyのWebフレームワークの下位にある共通インターフェースです
  • Rackアプリはcall(env)に応答し、[status, headers, body]を返します
  • ミドルウェアはアプリをラップして横断的な処理を追加します
  • Sinatraのuseまたはconfig.ruを使ってスタックを組み立てます
  • ミドルウェアはレスポンスを変更したり、リクエストをショートサーキットしたりできます

よくある質問

「ミドルウェアと Rack」レッスンは無料ですか?

はい。「ミドルウェアと Rack」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「ミドルウェアと Rack」で何を学びますか?

Rack スタックです。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「ミドルウェアと Rack」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Sinatra の基礎
  2. ルートとパラメーター
  3. JSON API
  4. ミドルウェアと Rack
← Ruby Academyに戻る