Курс по 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&current=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


💪 Или преминете направо към упражненията в този раздел.