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
| Begriff | Was er bedeutet |
|---|---|
| Backend | das Programm hinter einer Adresse, das Anfragen beantwortet |
| Route | die Regel, die eine Anfrage zu dem Code schickt, der sie bearbeitet |
| Handler | der Code, der eine Art von Anfrage beantwortet |
| Query-String | der Teil einer Adresse nach dem Fragezeichen |
| Parameter | ein Wert, der getrennt vom SQL-Text an die Datenbank geht |
| Antwort | Status, 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
export PGPASSWORD=shopHier 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
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
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
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
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
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
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
docker logs --tail 30 db 2>&1 | grep -o 'SELECT "public"."buecher"[^)]*' | tail -1Hier 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 Anfrage | Was er fragt | Das geschickte SQL |
|---|---|---|
| /buecher | Die Tabelle buecher | FROM "public"."buecher" |
| verfuegbar=eq.true | Nur Zeilen, in denen verfuegbar true ist | WHERE "public"."buecher"."verfuegbar" = $1 |
| select=titel | Nur die Spalte titel | SELECT "public"."buecher"."titel" |
| order=id | In der Reihenfolge von id | ORDER BY "public"."buecher"."id" |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den getrennt geschickten Wert lesen
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1Hier 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
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
docker logs --tail 30 db 2>&1 | grep -o 'parameters: .*' | tail -1Hier 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
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
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.