Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Webprogrammeren / Cro 101
Een Cro-route
Een Cro-HTTP-service wordt beschreven door een verzameling
routes: elke route zegt welke URL hij afhandelt en wat hij
teruggeeft. Je bouwt ze binnen een route-blok met het
sleutelwoord get:
use Cro::HTTP::Router;
use Cro::HTTP::Server;
my $application = route {
get -> 'hello' {
content 'text/plain', 'Hello from Cro!';
}
}
my $server = Cro::HTTP::Server.new(
:host('127.0.0.1'),
:port(8080),
:application($application),
);
$server.start;
say 'Listening on http://127.0.0.1:8080/hello — press Ctrl-C to stop';
react {
whenever signal(SIGINT) {
$server.stop;
done;
}
}Lees de route als “een GET-verzoek voor het pad
hello geeft de tekst Hello from Cro! terug”.
De functie content stelt zowel het contenttype als de body
in — geen handmatige statusregels of \r\n te bekennen.
Cro::HTTP::Server bindt de routes aan een adres en poort,
en .start begint met bedienen.
Eén subtiliteit: .start blokkeert niet
— het start de service op achtergrondthreads en keert meteen terug, en
als het programma daar eenvoudigweg eindigde, zou de server ermee
verdwijnen. Het afsluitende react-blok is wat het programma
in leven houdt, en het is een oude bekende:
whenever signal(SIGINT) reageert op het
onderbrekingssignaal (Ctrl-C op het toetsenbord) door de server te
stoppen en done aan te roepen. De reactieve gereedschappen
van eerder in dit deel zijn precies hoe een Cro-programma wacht, bedient
en netjes afsluit.
Dit voorbeeld heeft Cro geïnstalleerd nodig (
zef install cro). Draai het, openhttp://127.0.0.1:8080/hello, en stop de server met Ctrl-C als je klaar bent.
Maak je geen zorgen als de server tijdens het browsen af en toe
Cannot write to a closed socketafdrukt. Dat is geen fout in je code: een client — meestal een browser — opende een verbinding en liet die vallen voordat hij het antwoord las, wat browsers geregeld doen bij speculatieve of geannuleerde verzoeken. Cro noteert de verdwenen client, en de server blijft bedienen.
Een route kan URL-segmenten als parameters aannemen, JSON teruggeven en veel meer, maar de vorm is altijd deze: verklaar wat elk pad doet, geef de routes aan een server, en start hem. Vergeleken met de kale socketserver van de vorige sectie neemt Cro alle protocolboekhouding weg en laat het je alleen het deel schrijven dat specifiek is voor jouw service.
Deze route zegt echter altijd hetzelfde. De volgende pagina laat een
route een parameter uit de URL lezen, zodat één enkele
route /hello/Anna en /hello/Bob verschillend
kan begroeten.
Cursusnavigatie
← Quiz — Cro | Een route met een parameter →
💪 Of ga direct naar de
oefeningen in deze sectie.