Ruby Academy · Oppitunti

Middleware ja Rack

Rack-pino.

Oppitunti 4/413 vaihetta

Middleware ja Rack on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mikä Rack on

Rack on Ruby-verkkopalvelinten ja sovelluskehysten välinen minimaalinen rajapinta. Sinatra, Rails ja muut sovelluskehykset toimivat Rackin päällä.

  • Yhtenäistää pyyntöjen ja vastausten kulun
  • Mahdollistaa uudelleenkäytettävän väliohjelmiston
  • Rack-sovellus on mikä tahansa olio, joka vastaa kutsuun call(env)
app = lambda do |env|
  [200, { 'Content-Type' => 'text/plain' }, ['Hello Rack']]
end

puts app.call({}).inspect

Rack-sopimus

Rack-sovelluksen call-menetelmän on palautettava kolmen alkion taulukko:

  • Status-kokonaisluku (esimerkiksi 200)
  • Headers-hash
  • Body, joka vastaa kutsuun each (yleensä merkkijonojen taulukko)
status, headers, body = 200, { 'Content-Type' => 'text/html' }, ['<h1>Hi</h1>']
puts status
puts headers.inspect
body.each { |chunk| puts chunk }

env-hash

env-argumentti on pyynnön kuvaava hash.

  • REQUEST_METHOD, kuten GET tai POST
  • PATH_INFO, pyydetty polku
  • QUERY_STRING, käsittelemättömät kyselyparametrit
env = { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/home' }
puts "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"

Mikä väliohjelmisto on

Väliohjelmisto ympäröi sovelluksen ja lisää toiminnallisuutta ennen pyynnön saapumista sovellukseen tai sen jälkeen.

  • Lokitus, autentikointi ja pakkaus
  • Jokainen väliohjelmisto vastaa myös kutsuun call(env)
  • Se kutsuu ketjun seuraavaa sovellusta
class Logger
  def initialize(app)
    @app = app
  end

  def call(env)
    puts "Request: #{env['PATH_INFO']}"
    @app.call(env)
  end
end

Väliohjelmistoluokan rakentaminen

Väliohjelmisto tallentaa ympäröimänsä sovelluksen ja välittää kutsun sille call-menetelmässä.

  • Rakentaja vastaanottaa sisemmän sovelluksen
  • call voi muokata env-arvoa ja välittää kutsun eteenpäin
  • Se voi myös muuttaa vastausta paluumatkalla
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'

Väliohjelmistopino

Väliohjelmisto muodostaa pinon. Pyyntö kulkee pinoa pitkin sovellukseen ja vastaus takaisin ylöspäin.

  • Ulompi väliohjelmisto suoritetaan ensimmäisenä menomatkalla
  • Ulompi väliohjelmisto suoritetaan viimeisenä paluumatkalla
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

Väliohjelmiston käyttäminen Sinatrassa

Lisätkää väliohjelmisto Sinatra-sovellukseen komennolla use.

  • use Rack::Logger
  • use-kutsujen järjestys määrittää pinon järjestyksen
require 'sinatra'

use Rack::Logger

get '/' do
  'Logged request'
end

config.ru ja rackup

config.ru-tiedosto käynnistää Rack-sovelluksen komennolla rackup tai Pumalla.

  • run asettaa lopullisen sovelluksen
  • use lisää sitä edeltävän väliohjelmiston
# config.ru
require './app'
use Rack::CommonLogger
run Sinatra::Application

Yleisiä sisäänrakennettuja väliohjelmistoja

Rack toimitetaan hyödyllisten väliohjelmistojen kanssa.

  • Rack::CommonLogger pyyntölokit
  • Rack::Deflater gzip-pakkaus
  • Rack::Static tiedostojen tarjoaminen
  • Rack::Session::Cookie istunnot
# In config.ru
# use Rack::Deflater
# use Rack::Static, urls: ['/assets'], root: 'public'
puts 'See comments for usage'

Vastauksen muuttaminen

Väliohjelmisto lisää usein vastausotsakkeita sisemmän sovelluksen suorittamisen jälkeen.

  • Ottakaa vastaan kolmiosainen vastaus
  • Muuttakaa otsakkeita ja palauttakaa vastaus
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

Pyyntöjen oikosulkeminen

Väliohjelmisto voi pysäyttää pyynnön kutsumatta sisempää sovellusta.

  • Hyödyllinen autentikoinnin tarkistuksissa tai nopeusrajoituksissa
  • Palauttakaa vastauskolmikko suoraan
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]

Pikatarkistus

Varmistakaa Rackia koskeva ymmärryksenne.

Kertaus

Opitte Rack-pinon toimintaperiaatteen:

  • Rack on Ruby-verkkosovelluskehysten alla oleva yhteinen rajapinta
  • Rack-sovellus vastaa kutsuun call(env) ja palauttaa arvon [status, headers, body]
  • Väliohjelmisto ympäröi sovelluksen ja lisää poikkileikkaavaa toiminnallisuutta
  • Kootkaa pino käyttämällä use-komentoa Sinatrassa tai config.ru-tiedostoa
  • Väliohjelmisto voi muuttaa vastauksia tai oikaista pyynnöt
Aloita maksutta

Opi Ruby tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
29
Oppitunnit
109

Usein kysytyt kysymykset

Onko oppitunti ”Middleware ja Rack” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ruby Academy-oppimispolun 3 oppituntia, myös oppitunnin “Middleware ja Rack”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Middleware ja Rack”?

Rack-pino. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Ruby Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Middleware ja Rack”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Ruby Academy-oppitunnilla?

Kyllä. Jokainen Ruby Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Sinatran perusteet
  2. Reitit ja parametrit
  3. JSON-rajapinnat
  4. Middleware ja Rack
← Takaisin: Ruby Academy