Курс 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   |   Маршрут з параметром


💪 Або перейдіть одразу до вправ цього розділу.