Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Webprogrammeren / Cro 101
Ophalen van een publieke API
De client van de vorige pagina bereikt elke server op het web, niet
alleen die van jou. Veel openbare API’s antwoorden met JSON, en Cro
ontleedt dat voor je, zodat .body een kant-en-klare
gegevensstructuur teruggeeft in plaats van tekst. Hier vragen we een
gratis weerdienst om de huidige temperatuur in Berlijn:
use Cro::HTTP::Client;
my $url = 'https://api.open-meteo.com/v1/forecast'
~ '?latitude=52.52&longitude=13.41¤t=temperature_2m,wind_speed_10m';
my $response = await Cro::HTTP::Client.get($url);
my %current = (await $response.body)<current>;
say "Berlin right now:";
say " temperature: %current<temperature_2m> °C";
say " wind speed: %current<wind_speed_10m> km/h";wat zoiets afdrukt als:
Berlin right now:
temperature: 21.9 °C
wind speed: 8.4 km/hDe precieze getallen veranderen natuurlijk met het weer. De twee
getallen in de URL zijn geografische coördinaten —
52.52° N, 13.41° O is Berlijn — dus zet je eigen breedte-
en lengtegraad daar neer om je plaatselijke weer te krijgen. Hoe dan ook
geven één verzoek en .body (of .body-text) je
het antwoord — geen sockets, geen statusontleding, geen JSON met de hand
afhandelen.
Kale tekst voor de terminal
JSON is niet de enige vorm die een antwoord kan aannemen. De weerdienst wttr.in kan ook JSON leveren, maar zijn specialiteit is kale tekst die voor de terminal getekend is — en hij bepaalt het formaat door te kijken wie het vraagt: clients op de opdrachtregel krijgen tekst, browsers krijgen een webpagina. Cro laat je verzoekheaders instellen, dus stel jezelf voor als een van de terminalmensen:
use Cro::HTTP::Client;
my $response = await Cro::HTTP::Client.get(
'https://wttr.in/Berlin?format=3',
headers => [ User-Agent => 'curl' ],
);
print await $response.body-text;Dit drukt een weerbericht van één regel af, klaar voor een shellprompt of een statusbalk:
Berlin: 🌤️ +25°CHier is de body kale tekst, dus wordt hij met .body-text
gelezen. Laat de ?format=3 uit de URL weg en de dienst
antwoordt in plaats daarvan met haar volledige weerbericht in
ASCII-kunst over meerdere regels.
Deze voorbeelden hebben Cro geïnstalleerd (
zef install cro) en een werkende netwerkverbinding nodig.
Verzoeken en antwoorden zijn echter niet het hele verhaal. Het laatste onderwerp opent een WebSocket — een levend tweewegkanaal waar de reactieve gereedschappen van dit deel hun grote finale krijgen.
Cursusnavigatie
← Een clientmodule gebruiken | WebSockets →
💪 Of ga direct naar de
oefeningen in deze sectie.