| 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 Welt
Auf dem Server gab es durch den Aufruf von console.log folgende Zeilen:
$ node server1.js
Server gestartet
/
GET
curl/7.58.0