Курс 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 →
💪 Або перейдіть одразу до вправ цього розділу.