Курс по 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 не блокира — той стартира услугата във фонови нишки и се връща веднага, а ако програмата просто свършеше дотук, сървърът щеше да изчезне заедно с нея. Живa програмата държи завършващият блок 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   |   Маршрут с параметър


💪 Или преминете направо към упражненията в този раздел.