Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Reta programado / Bazoj de Cro

Uzi klientan modulon

Cro estas ne nur por konstrui servojn — ĝi ankaŭ liveras HTTP-klienton por fari petojn. La plej klara maniero konatiĝi kun ĝi estas celi ĝin al la sama servilo, kiun vi konstruis sur la antaŭa paĝo. Ĉi tie ambaŭ duonoj kuras en unu programo: ni startigas la servon, poste vokas ĝin mem.

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

# la eta servo de la antaŭa paĝo
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;

# nun estu la kliento kaj voku ĝin
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 redonas promeson — konvene, ĉar reta peto finiĝas poste — do vi await-as ĝin. La responda objekto konas sian staton, kapojn kaj korpon; await $response.body-text redonas la tekston, kiun la servilo sendis, Hello from Cro!. Komparu tion kun la kruda kontaktskatolo de la sekcio pri konektoj: estas neniu \r\n, neniu statusa linio analizenda, neniu legado en buklo — la kliento kaj la servilo parolas unu kun la alia en kelkaj simplaj linioj.

Ĉi tiu ekzemplo bezonas Cro instalitan (zef install cro).

Kiam la paĝo ne estas tie

Kio, se vi petas vojon, kiun la servo ne havas? La servila flanko estas facila: peto, kiu kongruas kun neniu vojo, ricevas 404 Not Found de Cro aŭtomate. Ĉe la klienta flanko, malsukcesa peto ĵetas escepton — la eraro vojaĝas kun la promeso kaj elsaltas ĉe await, ĝuste kiel vi vidis ĉe rompitaj promesoj — do vi traktas ĝin per la kutimaj esceptaj iloj:

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

Nia servo havas vojon hello, sed neniun goodbye, do ĉi tio presas Request failed with status 404. La escepto portas la plenan respondon en sia .response, kun la statuskodo kaj kapoj pretaj por inspekto.

Via propra servo tamen estas nur la plej proksima servilo, kiu ekzistas. La sekva paĝo celas la saman klienton al la pli vasta reto — publikaj API-oj, kiuj respondas per JSON aŭ per teksto preta por la terminalo.

Kursa navigado

Vojo kun parametro   |   Peti de publika API


💪 Aŭ iru rekte al la ekzercoj de ĉi tiu sekcio.