Курс языка программирования 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. Уберите из URL ?format=3 — и
сервис ответит полной многострочной сводкой, нарисованной
ASCII-графикой.
Этим примерам нужен установленный Cro (
zef install cro) и работающая сеть.
Впрочем, запросы и ответы — ещё не вся история. Заключительная тема открывает WebSocket: живой двусторонний канал, где реактивные инструменты этой части получают своё большое финале.
Навигация по курсу
← Использование клиентского модуля | WebSocket →
💪 Или перейдите сразу к
упражнениям этого раздела.