มิดเดิลแวร์และ Rack
สแตก Rack
มิดเดิลแวร์และ Rack เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
Rack คืออะไร
Rack คืออินเทอร์เฟซขั้นต่ำระหว่างเว็บเซิร์ฟเวอร์ Ruby กับเฟรมเวิร์กต่าง ๆ โดย Sinatra, Rails และเฟรมเวิร์กอื่น ๆ ล้วนทำงานบน Rack
- กำหนดมาตรฐานวิธีการไหลของคำขอและการตอบกลับ
- ทำให้สามารถนำมิดเดิลแวร์กลับมาใช้ซ้ำได้
- แอป Rack คือสิ่งใดก็ตามที่ตอบสนองต่อ
call(env)
app = lambda do |env|
[200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end
puts app.call({}).inspectสัญญาของ Rack
call ของแอป Rack ต้องส่งคืนอาร์เรย์สามองค์ประกอบ
- จำนวนเต็มสถานะ เช่น 200
- แฮชส่วนหัว
- เนื้อหาที่ตอบสนองต่อ
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 หรือ POSTPATH_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
เพิ่มมิดเดิลแวร์ให้แอป Sinatra ด้วย use
use Rack::Logger- ลำดับการเรียก
useจะกำหนดลำดับของสแตก
require 'sinatra'
use Rack::Logger
get '/' do
'Logged request'
endconfig.ru และ rackup
ไฟล์ config.ru จะเริ่มต้นแอป Rack ด้วย rackup หรือ Puma
runจะกำหนดแอปสุดท้ายuseจะเพิ่มมิดเดิลแวร์ไว้ก่อนหน้านั้น
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Applicationมิดเดิลแวร์ในตัวที่ใช้บ่อย
Rack มาพร้อมมิดเดิลแวร์ที่มีประโยชน์หลายรายการ
- บันทึกคำขอด้วย
Rack::CommonLogger - การบีบอัด gzip ด้วย
Rack::Deflater - ให้บริการไฟล์ด้วย
Rack::Static - เซสชันด้วย
Rack::Session::Cookie
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'การแก้ไขการตอบกลับ
มิดเดิลแวร์มักเพิ่มส่วนหัวการตอบกลับหลังจากแอปภายในทำงานเสร็จ
- เก็บชุดสามส่วนของการตอบกลับไว้
- แก้ไขส่วนหัว แล้วส่งคืนชุดนั้น
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การตัดคำขอให้สิ้นสุดก่อน
มิดเดิลแวร์สามารถหยุดคำขอได้โดยไม่เรียกแอปภายใน
- มีประโยชน์สำหรับด่านการยืนยันตัวตนหรือการจำกัดอัตรา
- ส่งคืนชุดสามส่วนของการตอบกลับโดยตรง
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
- แอป Rack ตอบสนองต่อ
call(env)และส่งคืน[status, headers, body] - มิดเดิลแวร์จะห่อแอปเพื่อเพิ่มการทำงานที่ใช้ร่วมกันหลายส่วน
- ใช้
useใน Sinatra หรือconfig.ruเพื่อประกอบสแตก - มิดเดิลแวร์สามารถแก้ไขการตอบกลับหรือตัดคำขอให้สิ้นสุดก่อน
คำถามที่พบบ่อย
บทเรียน “มิดเดิลแวร์และ Rack” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “มิดเดิลแวร์และ Rack” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์และ Rack”
สแตก Rack คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “มิดเดิลแวร์และ Rack” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม
ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน Sinatra
- เส้นทางและพารามิเตอร์
- API แบบ JSON
- มิดเดิลแวร์และ Rack