Middleware e Rack
Lo stack Rack
Middleware e Rack è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.
Che cos'è Rack?
Rack è l'interfaccia minima tra i server web Ruby e i framework. Sinatra, Rails e altri framework vengono tutti eseguiti su Rack.
- Standardizza il modo in cui fluiscono richieste e risposte
- Consente di riutilizzare i middleware
- Un'app Rack è qualsiasi oggetto che risponde a
call(env)
app = lambda do |env|
[200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end
puts app.call({}).inspectIl contratto Rack
Il metodo call di un'app Rack deve restituire un array di tre elementi:
- Un intero di stato (ad esempio 200)
- Un hash di intestazioni
- Un corpo che risponde a
each(di solito un array di stringhe)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }L'hash env
L'argomento env è un hash che descrive la richiesta.
REQUEST_METHOD, ad esempio GET o POSTPATH_INFO, il percorso richiestoQUERY_STRING, i parametri di query non elaborati
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"Che cos'è un middleware?
Il middleware avvolge un'app per aggiungere comportamenti prima o dopo che la richiesta la raggiunga.
- Registrazione, autenticazione, compressione
- Ogni middleware risponde a sua volta a
call(env) - Chiama l'app successiva nella catena
class Logger
def initialize(app)
@app = app
end
def call(env)
puts "Request: #{env['PATH_INFO']}"
@app.call(env)
end
endCreazione di una classe middleware
Il middleware memorizza l'app avvolta e delega a essa nel metodo call.
- Il costruttore riceve l'app interna
callpuò modificare env e poi inoltrare la richiesta- Può anche modificare la risposta durante il ritorno
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'Lo stack dei middleware
I middleware formano uno stack. La richiesta scende fino all'app e la risposta risale.
- I middleware esterni vengono eseguiti per primi all'andata
- I middleware esterni vengono eseguiti per ultimi al ritorno
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.inspectUtilizzo dei middleware in Sinatra
Aggiunga un middleware a un'app Sinatra con use.
use Rack::Logger- L'ordine delle chiamate a
usedefinisce l'ordine dello stack
require 'sinatra'
use Rack::Logger
get '/' do
'Logged request'
endconfig.ru e rackup
Un file config.ru avvia un'app Rack con rackup o Puma.
runimposta l'app finaleuseaggiunge i middleware prima di essa
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::ApplicationMiddleware integrati comuni
Rack include middleware utili.
Rack::CommonLoggerregistra le richiesteRack::Deflatercomprime con gzipRack::Staticserve i fileRack::Session::Cookiegestisce le sessioni
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'Modifica della risposta
Spesso il middleware aggiunge intestazioni alla risposta dopo l'esecuzione dell'app interna.
- Acquisisca la tripla della risposta
- Modifichi le intestazioni e poi la restituisca
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].inspectInterruzione anticipata delle richieste
Il middleware può interrompere una richiesta senza chiamare l'app interna.
- È utile per i controlli di autenticazione o i limiti di frequenza
- Restituisca direttamente una tripla della risposta
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]Controllo rapido
Verifichi la sua comprensione di Rack.
Riepilogo
Ha imparato a conoscere lo stack Rack:
- Rack è l'interfaccia comune alla base dei framework web Ruby
- Un'app Rack risponde a
call(env)e restituisce[status, headers, body] - Il middleware avvolge un'app per aggiungere comportamenti trasversali
- Utilizzi
usein Sinatra oconfig.ruper comporre lo stack - Il middleware può modificare le risposte o interrompere anticipatamente le richieste
Domande Frequenti
La lezione «Middleware e Rack» è gratuita?
Sì — il testo completo di «Middleware e Rack» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.
Cosa imparerò in «Middleware e Rack»?
Lo stack Rack Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ruby Academy?
Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Middleware e Rack»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ruby Academy?
Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Basi di Sinatra
- Route e parametri
- API JSON
- Middleware e Rack