Folosind Rack

În articolul precedent, ai aflat ce este Rack. Acum, este timpul să începeți să folosiți Rack și să serviți câteva pagini.

Salut Lume

În primul rând, să începem cu o aplicație „Hello world”. Această aplicație, indiferent de tipul de cerere, va reveni cu un cod de stare de 200 (care este HTTP-vorbire pentru „OK”) și șirul "Salut Lume" ca corpul.

Înainte de a examina următorul cod, luați în considerare din nou cerințele pe care trebuie să le îndeplinească orice aplicație Rack.

O aplicație Rack este orice obiect Ruby care răspunde la metoda de apel, ia un singur parametru hash și returnează un tablou care conține codul de stare a răspunsului, anteturile de răspuns HTTP și corpul de răspuns ca un tablou de șiruri.
clasa HelloWorld
def apel (env)
return [200, , ["Hello lume!"]]
Sfârșit
Sfârșit

După cum puteți vedea, un obiect de tip Salut Lume va îndeplini toate aceste cerințe. O face într-un mod foarte minim și nu extrem de util, dar îndeplinește toate cerințele.

WEBrick

Este destul de simplu, acum să-l conectăm la WEBrick (serverul HTTP care vine cu Ruby). Pentru a face acest lucru, folosim Rack :: Handler :: WEBrick.run metoda, trece-o o instanță a Salut Lume și portul pentru a merge mai departe. Acum va fi executat un server WEBrick și Rack va transmite cereri între serverul HTTP și aplicația dvs..

Rețineți că acesta nu este un mod ideal de a lansa lucrurile cu Rack. Se afișează aici doar pentru a obține ceva care rulează înainte de a vă scufunda într-o altă caracteristică a Rack-ului numită „Rackup”, care este prezentată mai jos. Utilizarea Rack :: Handler în acest fel are câteva probleme. În primul rând, nu este foarte configurabil. Totul este codat în scenariu. În al doilea rând, după cum veți observa dacă rulați următorul script, nu puteți ucide programul. Nu va răspunde la Ctrl-C. Dacă executați această comandă, pur și simplu închideți fereastra terminalului și deschideți una nouă.

#! / usr / bin / env ruby
necesita 'rack'
clasa HelloWorld
def apel (env)
return [200, , ["Hello lume!"]]
Sfârșit
Sfârșit
Rack :: Handler :: WEBrick.run (
HelloWorld.new,
: Port => 9000
)

A castiga

Deși acest lucru este destul de ușor de făcut, nu este modul în care Rack este folosit în mod normal. Rack-ul este folosit în mod normal cu un instrument numit a castiga. Rackup-ul face mai mult sau mai puțin ceea ce era în secțiunea de jos a codului de mai sus, dar într-un mod mai utilizabil. Rackup-ul este executat de pe linia de comandă și i se oferă un .ru „Fișier Rackup”. Acesta este doar un script Ruby care, printre altele, alimentează o aplicație pentru Rackup.

Un fișier Rackup foarte de bază pentru cele de mai sus ar arăta așa.

clasa HelloWorld
def apel (env)
întoarcere [
200,
'Content-Type' => 'text / html',
["Salut Lume!"]
]
Sfârșit
Sfârșit
executați HelloWorld.new

În primul rând, a trebuit să facem o mică schimbare în Salut Lume clasă. Rackup rulează o aplicație numită middleware Rack :: Lint că sancțiunea verifică răspunsurile. Toate răspunsurile HTTP ar trebui să aibă Tipul de conținut antet, astfel încât s-a adăugat. Apoi, ultima linie creează doar o instanță a aplicației și o transmite la alerga metodă. În mod ideal, aplicația dvs. nu ar trebui să fie scrisă complet în fișierul Rackup, acest fișier ar trebui să solicite aplicația în ea și să creeze o instanță în acest fel. Fișierul Rackup este doar „lipici”, nu trebuie să existe niciun cod de aplicație real.

Dacă executați comanda rackup helloworld.ru, va porni un server pe portul 9292. Acesta este portul Rackup implicit.

Rackup-ul are câteva caracteristici mai utile. În primul rând, lucruri precum portul pot fi schimbate pe linia de comandă sau într-o linie specială din script. Pe linia de comandă, treceți pur și simplu un -p port parametru. De exemplu: rackup -p 1337 helloworld.ru. Din scriptul în sine, dacă prima linie începe cu # \, apoi este analizat la fel ca linia de comandă. Deci, puteți defini și opțiuni aici. Dacă doriți să rulați pe portul 1337, prima linie a fișierului Rackup ar putea fi citită # \ -p 1337.