Курс языка программирования 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. Уберите из URL ?format=3 — и сервис ответит полной многострочной сводкой, нарисованной ASCII-графикой.

Этим примерам нужен установленный Cro (zef install cro) и работающая сеть.

Впрочем, запросы и ответы — ещё не вся история. Заключительная тема открывает WebSocket: живой двусторонний канал, где реактивные инструменты этой части получают своё большое финале.

Навигация по курсу

Использование клиентского модуля   |   WebSocket


💪 Или перейдите сразу к упражнениям этого раздела.