Курс 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


💪 Або перейдіть одразу до вправ цього розділу.