Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Веб-программирование / Основы Cro

Маршрут с параметром

Маршрут с предыдущей страницы всегда возвращал один и тот же текст. Настоящие сервисы меняют ответ в зависимости от того, что просит клиент, и проще всего для этого прочитать часть URL как параметр. В маршруте Cro сегмент после фиксированного пути становится переменной в сигнатуре:

use Cro::HTTP::Router;
use Cro::HTTP::Server;

my $application = route {
    get -> 'hello', $name {
        content 'text/plain', "Hello, $name!";
    }
}

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 — press Ctrl-C to stop';

react {
    whenever signal(SIGINT) {
        $server.stop;
        done;
    }
}

Самое интересное — сигнатура -> 'hello', $name: она сопоставляется с путём из двух сегментов, буквального hello и чего угодно, что захватывается в $name. Остальная часть программы — та же серверная обвязка, что и на предыдущей странице. Запрос /hello/Anna связывает $name со строкой Anna и возвращает Hello, Anna!, а /hello/Bob возвращает Hello, Bob!. Один маршрут — свой ответ для каждого имени:

$ curl http://127.0.0.1:8080/hello/Anna
Hello, Anna!

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

Параметры — это то, благодаря чему маршрут остаётся коротким, обслуживая целое семейство путей. Маршрут может принимать несколько сегментов, сопоставляться только с определёнными формами, читать строку запроса и возвращать JSON, — но всё это строится на одной идее: назовите изменчивые части URL в сигнатуре и используйте их в ответе.

Пути, не подошедшие ни одному маршруту, — не ваша забота: Cro сам отвечает на них 404 Not Found. А когда маршрут подошёл, но выдать нечего — скажем, по имени ничего не нашлось, — вызовите в обработчике not-found, чтобы отправить тот же 404 намеренно. Метод проверяется так же строго, как и путь: этот блок объявляет только get, поэтому запрос HEAD или POST по тому же пути получит 405 Method Not Allowed. Убедиться в этом можно самому командой curl -I, которая отправляет HEAD, а не GET.

Впрочем, сервис — лишь половина картины: кто-то должен его вызывать. На следующей странице мы развернём Cro и воспользуемся его клиентом, чтобы поговорить с сервером вроде тех, что вы только что построили.

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

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


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