ミドルウェアと 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({}).inspectRackの契約
Rackアプリのcallは、3要素の配列を返す必要があります。
- Status整数(例:200)
- Headersハッシュ
- Body
eachに応答するもの(通常は文字列の配列)
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.inspectSinatraでミドルウェアを使う
useを使ってSinatraアプリにミドルウェアを追加します。
use Rack::Loggeruseの呼び出し順でスタックの順序が決まります
require 'sinatra'
use Rack::Logger
get '/' do
'Logged request'
endconfig.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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Sinatra の基礎
- ルートとパラメーター
- JSON API
- ミドルウェアと Rack