Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Уеб програмиране / Основи на Cro
Заявка към публично API
Клиентът от предишната страница достига всеки сървър в мрежата, не
само вашия собствен. Много публични API-та отговарят с JSON и Cro го
разбира вместо вас, така че .body връща готова структура от
данни, а не текст. Тук питаме безплатна метеорологична услуга за
текущата температура в Берлин:
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";което отпечатва нещо като:
Berlin right now:
temperature: 21.9 °C
wind speed: 8.4 km/hТочните числа, разбира се, се менят с времето. Двете числа в URL
адреса са географски координати —
52.52° с. ш., 13.41° и. д. е Берлин, — така че сложете там
ширината и дължината на своя град, за да получите местното си време.
Така или иначе, една заявка и .body (или
.body-text) ви дават отговора — без сокети, без разбор на
състояние, без ръчна работа с JSON.
Обикновен текст за терминала
JSON не е единствената форма, която отговорът може да приеме. Метеорологичната услуга wttr.in може да поднася и JSON, но специалността ѝ е обикновен текст, изрисуван за терминал — а форматът решава според това кой пита: клиентите от командния ред получават текст, браузърите получават уеб страница. Cro ви позволява да задавате заглавки на заявката, така че се представете като един от терминалните хора:
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;Това отпечатва едноредова метеорологична справка, готова за подсказка на обвивката или лента за състояние:
Berlin: 🌤️ +25°CТук тялото е обикновен текст, така че се чете с
.body-text. Махнете ?format=3 от URL адреса и
услугата ще отговори вместо това с пълната си многоредова метеорологична
справка в стил ASCII графика.
Тези примери се нуждаят от инсталиран Cro (
zef install cro) и работеща мрежова връзка.
Заявките и отговорите обаче не са цялата история. Последната тема отваря WebSocket — жив двупосочен канал, в който реактивните средства от тази част получават своя тържествен финал.
Навигация в курса
← Използване на клиентски модул | WebSocket →
💪 Или преминете направо към упражненията в този
раздел.