Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Веб-програмування / Основи Cro

Використання клієнтського модуля

Cro призначений не лише для побудови сервісів — він постачає також HTTP-клієнт для надсилання запитів. Найзрозуміліший спосіб із ним познайомитися — спрямувати його на той самий сервер, який ви збудували на попередній сторінці. Тут обидві половини працюють в одній програмі: ми запускаємо сервіс, а потім самі його викликаємо.

use Cro::HTTP::Router;
use Cro::HTTP::Server;
use Cro::HTTP::Client;

# крихітний сервіс із попередньої сторінки
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;

# а тепер побудьмо клієнтом і викличмо його
my $response = await Cro::HTTP::Client.get('http://127.0.0.1:8080/hello');
say await $response.body-text; # Hello from Cro!

$server.stop;

Cro::HTTP::Client.get повертає обіцянку — і це доречно, бо мережевий запит завершується пізніше, — тож ви робите await. Об’єкт відповіді знає свій стан, заголовки й тіло; await $response.body-text повертає текст, який надіслав сервер, — Hello from Cro!. Порівняйте це із сирим сокетом із розділу про з’єднання: жодного \r\n, жодного рядка стану для розбору, жодного читання в циклі — клієнт і сервер говорять одне з одним кількома простими рядками.

Цьому прикладові потрібен встановлений Cro (zef install cro).

Коли сторінки немає

А що, як попросити шлях, якого сервіс не має? На боці сервера все просто: запит, що не збігається з жодним маршрутом, отримує від Cro 404 Not Found автоматично. На боці клієнта невдалий запит кидає виняток — помилка мандрує разом з обіцянкою й вискакує на await, точно як ви бачили зі зламаними обіцянками, — тож обробляєте ви її звичними засобами для винятків:

my $response = try await Cro::HTTP::Client.get('http://127.0.0.1:8080/goodbye');
if $! {
    say 'Request failed with status ', $!.response.status; # 404
}
else {
    say await $response.body-text;
}

Наш сервіс має маршрут hello, але не має goodbye, тож це друкує Request failed with status 404. Виняток несе повну відповідь у своєму .response, де є код стану та заголовки, готові до огляду.

Утім, ваш власний сервіс — це лише найближчий сервер, який тільки є. Наступна сторінка спрямовує той самий клієнт на ширший вебпростір — на публічні API, що відповідають JSON-ом або готовим до термінала текстом.

Навігація курсом

Маршрут з параметром   |   Запит до публічного API


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