Курс по 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


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