Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Web-Programmierung / Cro 101

Ein Client-Modul verwenden

Cro ist nicht nur zum Bauen von Diensten da — es liefert auch einen HTTP-Client zum Stellen von Anfragen. Am klarsten lernen Sie ihn kennen, indem Sie ihn auf genau den Server richten, den Sie auf der vorigen Seite gebaut haben. Hier laufen beide Hälften in einem Programm: Wir starten den Dienst und rufen ihn dann selbst auf.

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

# the tiny service from the previous page
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;

# now be the client and call it
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 liefert ein Promise — passend, denn eine Netzanfrage wird später fertig —, Sie await-en es also. Das Antwortobjekt kennt seinen Status, seine Header und seinen Rumpf; await $response.body-text reicht den Text zurück, den der Server gesendet hat, Hello from Cro!. Vergleichen Sie das mit dem rohen Socket aus dem Abschnitt über Verbindungen: kein \r\n, keine zu zerlegende Statuszeile, kein Lesen in einer Schleife — Client und Server sprechen in wenigen schlichten Zeilen miteinander.

Dieses Beispiel braucht Cro installiert (zef install cro).

Wenn die Seite nicht da ist

Was, wenn Sie nach einem Pfad fragen, den der Dienst nicht hat? Die Serverseite ist einfach: Eine Anfrage, die auf keine Route trifft, bekommt von Cro automatisch ein 404 Not Found. Auf der Clientseite wirft eine fehlgeschlagene Anfrage — der Fehler reist mit dem Promise mit und tritt beim await hervor, genau wie Sie es bei gebrochenen Promises gesehen haben —, Sie behandeln ihn also mit den gewohnten Ausnahmewerkzeugen:

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

Unser Dienst hat eine Route hello, aber kein goodbye, das gibt also Request failed with status 404 aus. Die Ausnahme trägt die vollständige Antwort in ihrem .response mit sich, mit Statuscode und Headern zum Nachsehen.

Ihr eigener Dienst ist allerdings nur der nächstgelegene Server. Die nächste Seite richtet denselben Client auf das weite Web — öffentliche Schnittstellen, die mit JSON oder terminaltauglichem Text antworten.

Kursnavigation

Eine Route mit Parameter   |   Von einer öffentlichen API abrufen


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.