Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Веб-програмування / Віддалені з’єднання
Надсилання та отримання
Щойно сокет відкрито, ви обмінюєтеся через нього даними. Надсилайте
текст через .print, а читайте те, що приходить назад, через
.recv:
my $conn = IO::Socket::INET.new(:host('raku.org'), :port(80));
$conn.print("GET / HTTP/1.0\r\nHost: raku.org\r\n\r\n");
my $response = $conn.recv;
$conn.close;
say $response.lines.first;Це надсилає мінімальний HTTP-запит і читає відповідь сервера в
$response. Першим рядком відповіді вебсервера є його рядок
стану.
Цьому прикладові потрібне робоче мережеве з’єднання. Коли його запустити, він друкує рядок стану відповіді. Оскільки
raku.orgперенаправляє звичайний HTTP на захищений HTTPS-сайт, цим рядком є перенаправлення, як-отHTTP/1.1 308 Permanent Redirect, а не200 OK. Особливий доменexample.comне перенаправляє, тож той самий запит, спрямований туди, надрукує звичайнеHTTP/1.1 200 OK.
Спілкуючись із серверами, важливо пам’ятати дві деталі. По-перше,
мережеві протоколи зазвичай розділяють рядки через \r\n
(повернення каретки плюс новий рядок), а не простим \n, —
саме тому запит записано з \r\n. По-друге,
.recv повертає ті дані, що надійшли на цю мить; для більших
відповідей ви читаєте в циклі, аж поки з’єднання не закриється.
Надсилання байтів і отримання байтів — це все, що сокет насправді робить. Усе інше — HTTP та вищерівневі засоби з наступних розділів — збудовано поверх цього простого «надішли й отримай».
Практика
Виконайте 1 тест за змістом цієї теми.
Навігація курсом
← Тест — Сокети | Тест — HTTP-запити →
💪 Або перейдіть одразу до вправ цього
розділу.