Utilizzando Rack

Nell'articolo precedente, hai imparato cos'è Rack. Ora è il momento di iniziare a utilizzare Rack e pubblicare alcune pagine.

Ciao mondo

Innanzitutto, iniziamo con un'applicazione "Hello world". Questa applicazione, indipendentemente dal tipo di richiesta, verrà restituita con un codice di stato di 200 (che è HTTP-speak per "OK") e la stringa "Ciao mondo" come il corpo.

Prima di esaminare il seguente codice, considerare di nuovo i requisiti che qualsiasi applicazione Rack deve soddisfare.

Un'applicazione Rack è qualsiasi oggetto Ruby che risponde al metodo call, accetta un singolo parametro hash e restituisce un array contenente il codice dello stato della risposta, le intestazioni di risposta HTTP e il corpo della risposta come un array di stringhe.
classe HelloWorld
def call (env)
return [200, , ["Ciao mondo!"]]
fine
fine

Come puoi vedere, un oggetto del tipo Ciao mondo soddisferà tutti questi requisiti. Lo fa in un modo molto minimale e non estremamente utile, ma soddisfa tutti i requisiti.

WEBrick

È abbastanza semplice, ora collegiamolo a WEBrick (il server HTTP fornito con Ruby). Per fare questo, usiamo il Rack :: :: Handler WEBrick.run metodo, passagli un'istanza di Ciao mondo e la porta su cui eseguire. Un server WEBrick sarà ora in esecuzione e Rack invierà richieste tra il server HTTP e l'applicazione.

Nota, questo non è un modo ideale per avviare le cose con Rack. Viene mostrato solo qui per far funzionare qualcosa prima di immergersi in un'altra funzionalità di Rack chiamata "Rackup", che viene mostrata di seguito. L'uso di Rack :: Handler in questo modo presenta alcuni problemi. Innanzitutto, non è molto configurabile. Tutto è codificato nello script. Secondo, come noterai se esegui il seguente script, non puoi uccidere il programma. Non risponderà a Ctrl-C. Se si esegue questo comando, è sufficiente chiudere la finestra del terminale e aprirne una nuova.

#! / usr / bin / env ruby
richiede 'rack'
classe HelloWorld
def call (env)
return [200, , ["Ciao mondo!"]]
fine
fine
Rack :: :: Handler WEBrick.run (
HelloWorld.new,
: Porta => 9000
)

Accumulare

Anche se questo è abbastanza facile da fare, non è il modo in cui Rack viene normalmente utilizzato. Il rack viene normalmente utilizzato con uno strumento chiamato accumulare. Rackup fa più o meno ciò che era nella parte inferiore del codice sopra, ma in un modo più utilizzabile. Il rackup viene eseguito dalla riga di comando e viene assegnato a .ru "File Rackup". Questo è solo uno script Ruby che, tra le altre cose, invia un'applicazione a Rackup.

Un file Rackup di base per quanto sopra sarebbe simile a questo.

classe HelloWorld
def call (env)
ritorno [
200,
'Content-Type' => 'text / html',
["Ciao mondo!"]
]
fine
fine
eseguire HelloWorld.new

Innanzitutto, abbiamo dovuto apportare una piccola modifica a Ciao mondo classe. Rackup esegue un'app middleware chiamata Rack :: Lint che la sanità mentale controlla le risposte. Tutte le risposte HTTP dovrebbero avere a Tipo di contenuto intestazione, quindi è stato aggiunto. Quindi, l'ultima riga crea solo un'istanza dell'app e la passa a correre metodo. Idealmente, l'applicazione non dovrebbe essere scritta interamente all'interno del file Rackup, questo file dovrebbe richiedere l'applicazione e crearne un'istanza in quel modo. Il file Rackup è solo "colla", nessun codice di applicazione reale dovrebbe essere lì.

Se si esegue il comando rackup helloworld.ru, avvierà un server sulla porta 9292. Questa è la porta Rackup predefinita.

Rackup ha alcune funzionalità più utili. Innanzitutto, cose come la porta possono essere modificate dalla riga di comando o in una riga speciale nello script. Sulla riga di comando, passa semplicemente a -porta p parametro. Per esempio: rackup -p 1337 helloworld.ru. Dallo stesso script, se la prima riga inizia con # \, quindi viene analizzato proprio come la riga di comando. Quindi puoi definire anche qui le opzioni. Se si desidera eseguire sulla porta 1337, è possibile leggere la prima riga del file Rackup # \ -p 1337.