Курс языка программирования 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 | Использование клиентского модуля →
💪 Или перейдите сразу к
упражнениям этого раздела.