Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Was ein Backend mit einer Anfrage tut

Nach dieser Lektion: Ich kann Schritt für Schritt sagen, was ein Backend mit einer Anfrage tut, und zeigen, wie es die Datenbank fragt.

Lektion, 60 Min.13 BefehlePostgreSQL-und-PostgREST-Lab: eine Datenbank und eine REST-API im Browser

Was in einem Backend mit einer Anfrage geschieht

Ein Backend ist das Programm hinter einer Webadresse, das Anfragen beantwortet. Es liest die Anfrage, entscheidet, wofür sie ist, fragt die Daten und schickt eine Antwort zurück.

Jedes Backend erledigt diese Aufgaben, in welcher Sprache es auch geschrieben ist. Der nächste Abschnitt nennt sie einzeln. In dieser Lektion sehen Sie einem zu.

Am Ende dieser Lektion

Notiz

Ich kann Schritt für Schritt sagen, was ein Backend mit einer Anfrage tut, und zeigen, wie es die Datenbank fragt.

Schlüsselwörter

BegriffWas er bedeutet
Backenddas Programm hinter einer Adresse, das Anfragen beantwortet
Routedie Regel, die eine Anfrage zu dem Code schickt, der sie bearbeitet
Handlerder Code, der eine Art von Anfrage beantwortet
Query-Stringder Teil einer Adresse nach dem Fragezeichen
Parameterein Wert, der getrennt vom SQL-Text an die Datenbank geht
AntwortStatus, Header und Inhalt, die ein Backend zurückschickt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Fünf Schritte von der Anfrage zur Antwort

Zuerst liest das Backend die Anfrage: Methode, Pfad und Query-String. Dann leitet es sie weiter und findet heraus, für welchen Handler sie ist.

Der Handler prüft die Anfrage, fragt die Daten und antwortet mit Status und Inhalt. Das Backend des Labs heißt PostgREST. Seine Routen sind die Tabellen. Legen Sie eine Tabelle zum Fragen an.

psql das Passwort geben

Befehl
export PGPASSWORD=shop

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Tabelle buecher anlegen

Befehl
psql -h db -U shop -c "drop table if exists buecher cascade; create table buecher (id serial primary key, titel text not null, jahr int not null, verfuegbar boolean not null default true); insert into buecher (titel, jahr, verfuegbar) values ('Karten der See', 1998, true), ('Fluesse Europas', 2004, false), ('Nachtzuege', 2011, true); notify pgrst, 'reload schema'"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Nach einer Spalte fragen, die es nicht gibt

Befehl
curl -s -w "\n" "http://api:3000/buecher?nope=eq.1"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Backend prüft, bevor es fragt

Die Antwort sagt, es gebe keine Spalte nope, mit einem 400 und einem Grund. Der Code 42703 stammt von PostgreSQL selbst: Hier hat die Datenbank den falschen Namen bemerkt.

Ein sorgfältiges Backend prüft Namen, bevor es die Daten fragt. Eine Anfrage, die nicht gehen kann, wird dann sofort abgewiesen und erreicht die Daten nie. Ihre Aufgabe arbeitet so.

Der Query-String ist die Frage der Anfrage

Die Adresse /buecher?verfuegbar=eq.true&select=titel&order=id sagt drei Dinge. Nur die Zeilen behalten, in denen verfuegbar gleich true ist. Nur die Spalte titel zurückgeben. Die Zeilen nach id ordnen.

Schicken Sie sie ab und stellen Sie der Datenbank dann dieselbe Frage selbst in SQL.

Die Anfrage abschicken

Befehl
curl -s -w "\n" "http://api:3000/buecher?verfuegbar=eq.true&select=titel&order=id"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Datenbank dieselbe Frage stellen

Befehl
psql -h db -U shop -At -c "select titel from buecher where verfuegbar = true order by id"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dem Backend beim Fragen der Datenbank zusehen

Das Backend hat dieses SQL für Sie geschrieben. Um es zu sehen, lassen Sie PostgreSQL jede Anweisung protokollieren, die es bekommt, und lesen Sie das Protokoll mit docker logs des Labs. Die Einstellung gilt nur für diese Lektion, und die letzten Runs schalten sie wieder aus.

docker logs geht nur in einem Lab, das seinen Docker-Befehl hat.

Die Protokollierung der Anweisungen einschalten

Befehl
psql -h db -U shop -c "alter system set log_statement = 'all'" -c "select pg_reload_conf()"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dieselbe Anfrage noch einmal abschicken

Befehl
curl -s -o /dev/null "http://api:3000/buecher?verfuegbar=eq.true&select=titel&order=id"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das SQL lesen, das das Backend schickte

Befehl
docker logs --tail 30 db 2>&1 | grep -o 'SELECT "public"."buecher"[^)]*' | tail -1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: Teil der Anfrage zu Teil des SQL

Teil der AnfrageWas er fragtDas geschickte SQL
/buecherDie Tabelle buecherFROM "public"."buecher"
verfuegbar=eq.trueNur Zeilen, in denen verfuegbar true istWHERE "public"."buecher"."verfuegbar" = $1
select=titelNur die Spalte titelSELECT "public"."buecher"."titel"
order=idIn der Reihenfolge von idORDER BY "public"."buecher"."id"

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Den getrennt geschickten Wert lesen

Befehl
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Wert reist getrennt vom SQL

Im SQL steht = $1. Der Wert, t für true, wurde getrennt geschickt, also behandelt die Datenbank ihn als Daten und nie als SQL. Deshalb kann eine Anfrage die Abfrage nicht umschreiben.

Beweisen Sie es. Schicken Sie einen Titel, der wie ein Angriff aussieht, und sehen Sie, was das Backend damit tut.

Einen Titel schicken, der wie SQL aussieht

Befehl
curl -s -G --data-urlencode "titel=eq.x'; drop table buecher; --" -w "\n" "http://api:3000/buecher"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Sehen, wie er weitergegeben wurde

Befehl
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Bücher zählen

Befehl
psql -h db -U shop -At -c "select count(*) from buecher"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Protokollierung wieder ausschalten

Befehl
psql -h db -U shop -c "alter system reset log_statement" -c "select pg_reload_conf()"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele halten ein Backend für ein bloßes Rohr zwischen Browser und Datenbank. Es prüft, entscheidet und begrenzt. Eine leere Antwort ist ein 200 ohne Inhalt, eine schlechte Anfrage ein 400, und das Backend muss beides unterscheiden.

Weiterdenken: eine größere Frage

Schreiben Sie im selben Stil eine Anfrage für diese Frage: die verfügbaren Bücher nach 2000, das neueste zuerst, nur Titel und Jahr. Schicken Sie sie mit curl ab.

Schreiben Sie dann das SQL auf, das Sie erwarten, und prüfen Sie es im Protokoll.

Über dieses Lab und seinen Quellcode: PostgreSQL-und-PostgREST-Lab: eine Datenbank und eine REST-API im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.