Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Веб-программирование / Основы Cro
Использование клиентского модуля
Cro нужен не только для создания сервисов — в его составе есть и HTTP-клиент для отправки запросов. Понятнее всего познакомиться с ним, направив его на тот самый сервер, который вы построили на предыдущей странице. Здесь обе половины работают в одной программе: мы запускаем сервис, а затем сами же его вызываем.
use Cro::HTTP::Router;
use Cro::HTTP::Server;
use Cro::HTTP::Client;
# крошечный сервис с предыдущей страницы
my $application = route {
get -> 'hello' { content 'text/plain', 'Hello from Cro!'; }
}
my $server = Cro::HTTP::Server.new(
:host('127.0.0.1'), :port(8080), :application($application),
);
$server.start;
# а теперь побудем клиентом и вызовем его
my $response = await Cro::HTTP::Client.get('http://127.0.0.1:8080/hello');
say await $response.body-text; # Hello from Cro!
$server.stop;Cro::HTTP::Client.get возвращает промис — что уместно,
ведь сетевой запрос завершается позже, — поэтому его дожидаются через
await. Объект ответа знает свой статус, заголовки и тело;
await $response.body-text отдаёт текст, отправленный
сервером, — Hello from Cro!. Сравните это с «сырым» сокетом
из раздела о
соединениях: ни \r\n, ни строки состояния для разбора,
ни чтения в цикле — клиент и сервер общаются в несколько простых
строк.
Этому примеру нужен установленный Cro (
zef install cro).
Когда страницы нет
А что, если запросить путь, которого у сервиса нет? На стороне
сервера всё просто: запрос, не подошедший ни одному маршруту,
автоматически получает от Cro 404 Not Found. На стороне
клиента неудавшийся запрос бросает исключение — ошибка
путешествует вместе с промисом и выныривает на await, как
вы видели у сломанных
промисов, — так что обрабатывают её обычными средствами работы с
исключениями:
my $response = try await Cro::HTTP::Client.get('http://127.0.0.1:8080/goodbye');
if $! {
say 'Request failed with status ', $!.response.status; # 404
}
else {
say await $response.body-text;
}В нашем сервисе есть маршрут hello, но нет
goodbye, поэтому программа печатает
Request failed with status 404. Исключение несёт полный
ответ в своём .response, где можно изучить и код состояния,
и заголовки.
Впрочем, ваш собственный сервис — лишь ближайший из существующих серверов. На следующей странице тот же клиент направляется в большой веб — к публичным API, которые отвечают JSON или готовым для терминала текстом.
Навигация по курсу
← Маршрут с параметром | Запрос к публичному API →
💪 Или перейдите сразу к
упражнениям этого раздела.