Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Веб-программирование / Основы Cro
Маршрут Cro
HTTP-сервис на Cro описывается набором маршрутов: каждый
маршрут указывает, какой URL он обслуживает и что возвращает. Строят их
внутри блока route с помощью ключевого слова
get:
use Cro::HTTP::Router;
use Cro::HTTP::Server;
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;
say 'Listening on http://127.0.0.1:8080/hello — press Ctrl-C to stop';
react {
whenever signal(SIGINT) {
$server.stop;
done;
}
}Читайте этот маршрут так: «запрос GET по пути
hello возвращает текст Hello from Cro!».
Функция content задаёт сразу и тип содержимого, и тело —
никаких строк состояния вручную, никаких \r\n в поле
зрения. Cro::HTTP::Server привязывает маршруты к адресу и
порту, а .start начинает обслуживание.
Одна тонкость: .start не блокирует
выполнение — он запускает сервис в фоновых потоках и тут же возвращает
управление, и, если бы программа на этом просто закончилась, сервер
исчез бы вместе с ней. В живых её удерживает завершающий блок
react, и он вам давно знаком:
whenever signal(SIGINT) реагирует на сигнал прерывания
(Ctrl-C с клавиатуры), останавливая сервер и вызывая done.
Реактивные инструменты из начала этой части — ровно то, чем программа на
Cro ждёт, обслуживает и аккуратно завершается.
Этому примеру нужен установленный Cro (
zef install cro). Запустите его, откройтеhttp://127.0.0.1:8080/hello, а закончив, остановите сервер по Ctrl-C.
Не пугайтесь, если сервер время от времени печатает
Cannot write to a closed socket, пока вы ходите по страницам. Это не ошибка в вашем коде: клиент — обычно браузер — открыл соединение и бросил его, не дочитав ответ, как браузеры постоянно делают со спекулятивными или отменёнными запросами. Cro отмечает исчезнувшего клиента, а сервер продолжает работать.
Маршрут может принимать сегменты URL как параметры, возвращать JSON и многое другое, но форма всегда одна: объявить, что делает каждый путь, передать маршруты серверу и запустить его. По сравнению с сервером на «сырых» сокетах из предыдущего раздела Cro убирает всю протокольную бухгалтерию и позволяет писать только ту часть, которая относится именно к вашему сервису.
Впрочем, этот маршрут всегда говорит одно и то же. На следующей
странице маршрут научится читать параметр из URL, так
что один маршрут сможет по-разному приветствовать
/hello/Anna и /hello/Bob.
Навигация по курсу
← Тест — Cro | Маршрут с параметром →
💪 Или перейдите сразу к
упражнениям этого раздела.