Курс языка программирования 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


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