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


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