Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Webprogrammeren / Cro 101
Een clientmodule gebruiken
Cro is niet alleen om services te bouwen — het levert ook een HTTP-client om verzoeken te doen. De duidelijkste manier om die te ontmoeten is hem op precies de server richten die je op de vorige pagina gebouwd hebt. Hier draaien beide helften in één programma: we starten de service en roepen haar daarna zelf aan.
use Cro::HTTP::Router;
use Cro::HTTP::Server;
use Cro::HTTP::Client;
# the tiny service from the previous page
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;
# now be the client and call it
my $response = await Cro::HTTP::Client.get('http://127.0.0.1:8080/hello');
say await $response.body-text; # Hello from Cro!
$server.stop;Cro::HTTP::Client.get geeft een promise terug — passend,
aangezien een netwerkverzoek later klaar is — dus await je
haar. Het antwoordobject kent zijn status, headers en body;
await $response.body-text overhandigt de tekst die de
server verstuurde, Hello from Cro!. Vergelijk dit met de
kale socket uit de sectie over
verbindingen: er is geen \r\n, geen statusregel om te
ontleden, geen lezen in een lus — de client en de server praten in een
paar simpele regels met elkaar.
Dit voorbeeld heeft Cro geïnstalleerd nodig (
zef install cro).
Wanneer de pagina er niet is
Wat als je om een pad vraagt dat de service niet heeft? De serverkant
is eenvoudig: een verzoek dat met geen enkele route matcht, krijgt
automatisch een 404 Not Found van Cro. Aan de clientkant
werpt een mislukt verzoek — de fout reist met de
promise mee en komt bij await naar buiten, precies zoals je
bij verbroken
promises zag — dus handel je haar met de gewone
exceptiegereedschappen af:
my $response = try await Cro::HTTP::Client.get('http://127.0.0.1:8080/goodbye');
if $! {
say 'Request failed with status ', $!.response.status; # 404
}
else {
say await $response.body-text;
}Onze service heeft een route hello maar geen
goodbye, dus drukt dit
Request failed with status 404 af. De exceptie draagt het
volledige antwoord mee in haar .response, met de statuscode
en de headers klaar om te bekijken.
Je eigen service is echter alleen de dichtstbijzijnde server die er is. De volgende pagina richt dezelfde client op het bredere web — openbare API’s die met JSON of terminalklare tekst antwoorden.
Cursusnavigatie
← Een route met een parameter | Ophalen van een publieke API →
💪 Of ga direct naar de
oefeningen in deze sectie.