Курс по 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 →
💪 Или преминете направо към упражненията в този
раздел.