Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Веб-програмування / Простий HTTP-сервер
Відповідь на запит
Щойно клієнт приєднався, ви читаєте його запит і надсилаєте відповідь. Для вебпереглядача відповідь має бути коректним HTTP: рядок стану, необов’язкові заголовки, порожній рядок, а потім тіло.
my $listener = IO::Socket::INET.new(
:listen,
:localhost('127.0.0.1'),
:localport(8080),
);
my $conn = $listener.accept;
my $request = $conn.recv;
$conn.print("HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, web!\n");
$conn.close;
$listener.close;Відповідь дзеркалить той формат запиту, який ви бачили на боці
клієнта. HTTP/1.0 200 OK — це рядок стану,
Content-Type: text/plain — заголовок, порожній рядок
(\r\n\r\n) завершує заголовки, а Hello, web! —
тіло, яке відображає браузер.
Запустіть цю програму, а потім гукніть її з іншого термінала за
допомогою curl (або відкрийте
http://127.0.0.1:8080/ у браузері) — і вона надрукує тіло
просто на екран:
$ curl http://127.0.0.1:8080/
Hello, web!Це обробляє один-єдиний запит і зупиняється. Щоб обслуговувати багато
запитів, ви обгорнули б кроки .accept—читання—відповідь у
цикл і зазвичай обробляли б кожне з’єднання у власному потоці виконання
чи обіцянці, щоб повільні клієнти не блокували інших. Але суть
вебсервера — рівно в цьому: прийми з’єднання, прочитай запит, напиши
HTTP-відповідь.
Наступна сторінка робить саме це — сервер, що лишається живим і в циклі відповідає на запит за запитом, а не зупиняється після першого.
Навігація курсом
← Тест — Очікування з’єднань | Обслуговування багатьох запитів →
💪 Або перейдіть одразу до вправи цього
розділу.