Raku kurss / Funkcionālā, paralēlā, reaktīvā un tīmekļa programmēšana / Tīmekļa programmēšana / Cro pamati

Klienta moduļa lietošana

Cro nav domāts tikai pakalpojumu būvēšanai — tam līdzi nāk arī HTTP klients pieprasījumu veikšanai. Skaidrākais veids, kā ar to iepazīties, ir pavērst to pret to pašu serveri, ko uzbūvējāt iepriekšējā lappusē. Šeit abas puses darbojas vienā programmā: mēs palaižam pakalpojumu un tad paši to izsaucam.

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

# sīkais pakalpojums no iepriekšējās lappuses
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;

# tagad esam klients un izsaucam to
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 atgriež solījumu — un tas ir loģiski, jo tīkla pieprasījums beidzas vēlāk —, tāpēc jūs to gaidāt ar await. Atbildes objekts zina savu statusu, galvenes un ķermeni; await $response.body-text atdod tekstu, ko serveris nosūtīja, Hello from Cro!. Salīdziniet to ar neapstrādāto ligzdu savienojumu sadaļā: nav nekādu \r\n, nav statusa rindas, ko parsēt, nav lasīšanas ciklā — klients un serveris savā starpā sarunājas dažās vienkāršās rindās.

Šim piemēram vajadzīgs uzstādīts Cro (zef install cro).

Kad lappuses tur nav

Kas notiek, ja prasāt ceļu, kāda pakalpojumam nav? Servera puse ir vienkārša: pieprasījums, kas neatbilst nevienam maršrutam, no Cro automātiski saņem 404 Not Found. Klienta pusē neizdevies pieprasījums met izņēmumu — kļūda ceļo līdzi solījumam un izlec pie await, gluži kā redzējāt ar lauztiem solījumiem —, tāpēc to apstrādā ar ierastajiem izņēmumu rīkiem:

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;
}

Mūsu pakalpojumam ir maršruts hello, bet nav goodbye, tāpēc tas izdrukā Request failed with status 404. Izņēmums savā .response nes pilnu atbildi ar statusa kodu un galvenēm, ko var apskatīt.

Jūsu pašu pakalpojums tomēr ir tikai tuvākais serveris, kāds vien ir. Nākamā lappuse pavērš to pašu klientu pret plašāko tīmekli — pret publiskiem API, kas atbild ar JSON vai terminālim gatavu tekstu.

Kursa navigācija

Maršruts ar parametru   |   Pieprasījums publiskam API


💪 Vai arī dodieties tieši uz šīs sadaļas vingrinājumiem.