Ein erstes Serverprogramm für HTTP | Ein Webserver, der Dateien ausgibt |
Auslesen des Anfrageparameters request
Der Parameter request liefert den Zugang zu den Informationen, die vom Client in seiner Anfrage mitgesandt wird.- url: Die Adresse, die der Client aufgerufen hat. Da der Host bereits angesprochen wurde, enthält die URL nur noch den lokalen Dateinamen inklusive Pfad innerhalb des Webservers.
- method: Die HTTP-Methode, die beim
Aufruf verwendet wurde. Das können folgende Strings sein.
- get
- post
- put
- delete
- headers: Die Header enthalten Attribute der Sendung, beispielsweise welcher Datentyp verwendet wird, welche Codierung oder die Cookies.
- body: Der Body enthält die Daten, die mit der Anfrage versendet worden sind.
const url = request.url; const method = request.method; const headers = request.headers;Mit dem folgenden Aufruf können Header, Methode und aufgerufene URL mit einer Zuweisung ausgelesen werden:
const { headers, method, url } = request;
Auslesen der Header
Es können die Header-Bereiche des HTTP-Pakets ausgelesen werden. Eine komplette Liste der Header-Einträge erzeugt der folgende Befehl:console.log(JSON.stringify(request.headers));Die Ausgabe ist beispielsweise:
{"host":"localhost:8080", "user-agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) ... Firefox/94.0", "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "accept-language":"de,en-US;q=0.7,en;q=0.3", "accept-encoding":"gzip, deflate", "dnt":"1", "connection":"keep-alive", "cookie":"csrftoken=evOF...357431; session_id=99999", "upgrade-insecure-requests":"1", "sec-fetch-dest":"document", "sec-fetch-mode":"navigate", "sec-fetch-site":"none", "sec-fetch-user":"?1", "cache-control":"max-age=0" }Um das Feld "user-agent" und damit den Browser des Aufrufers auf der Console anzuzeigen, wird die Zeichenkette als Index verwendet:
const {headers} = request; // oder: const headers = request.headers; console.log("Aufgerufen mit dem Browser: "+headers['user-agent']);
Der Request-Body
Der Body des Request-Parameters enthält die Daten, die der Client an den Server sendet. Das tritt eigentlich vor allem bei POST-Nachrichten aus Formularen auf.Diese werden eventuell stückweise geliefert. Darum müssen die Datenpakete so lange zusammengesetzt werden, bis mit "end" das letzte Paket signalisiert wird.
Erst dann kann der Body-Inhalt weiterverarbeitet werden.
var server = http.createServer(function(request, response) { // ... } else if (request.url==='/newuser' && request.method==='POST') { let postBody = ""; // Die Daten kommen in mehreren data-Blöcken request.on("data", function(chunk) { postBody += chunk; }); // Die Daten werden mit einem end-Block abgeschlossen request.on("end", function() { console.log(postBody); // Der gesamte Body wird ausgegeben // Auslesen der Parameter ... response.writeHead(200); // Antwort an Client response.end(msg); }); } // ... });
Antworten an den Client: response
Die Variable response wird an den Client als Antwort zurückgesendet.Der Status-Code zeigt eventuelle Fehler an. Beispielsweise könnte der Server den Status-Code auf 404 setzen, wenn eine gesuchte Datei nicht vorliegt.
response.statusCode = 404;Wird kein Status-Code angegeben, wird 200 gesandt.
Header
Auch der Server sendet Informationen über den HTTP-Header. Diese werden über die Methode setHeader übergeben.response.setHeader('Content-Type', 'text/html'); Der Status-Code kann auch durch die Methode writeHead gesendet werden.response.writeHead(200);Die Statusausgabe in writeHead kann durch die Headerattribute ergänzt werden.response.writeHead(201, {"content-type": "text/plain"});Dateninhalte
Durch die Methode write können die Inhalte an den Client gesendet werden.
response.write("Hallo Welt");Mit der Methode end wird das Ende der Übertragung signalisiert.
response.end();Man kann auch write und end zusammenfassen, indem die Ausgabe als Parameter an end übergeben wird.response.end("Hallo nochmal");Beispiel
Der folgende Server setzt den Content-Type und gibt als Status 201 zurück. Als Text liefert er einfach Hallo Welt.const http = require("http"); // Einbinden von http var server = http.createServer(function (request, response) { const {headers, method, url} = request; console.log(url); console.log(method); console.log(headers['user-agent']); response.writeHead(201, {"content-type": "text/plain"}); response.end("Hallo Welt"); // Browser-Inhalt }); server.listen(8080, "localhost", function () { console.log("Server gestartet"); });Zum Test wird der Befehl curl verwendet.$ curl -v http://localhost:8080 * Rebuilt URL to: http://localhost:8080/ * Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8080 (#0) > GET / HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.58.0 > Accept: */* > < HTTP/1.1 201 Created < content-type: text/plain < Date: Sun, 28 Nov 2021 09:21:29 GMT < Connection: keep-alive < Transfer-Encoding: chunked < * Connection #0 to host localhost left intact Hallo WeltAuf dem Server gab es durch den Aufruf von console.log folgende Zeilen:
$ node server1.js Server gestartet / GET curl/7.58.0