Get HTTP POST Body in Express.js

Einführung

In diesem kurzen Artikel werden wir uns ansehen, wie man Informationen aus einem POST-Body in Express.js extrahieren kann. Das HTTP-Protokoll bietet eine Reihe von Möglichkeiten, um Informationen von einem Client an einen Server zu übermitteln, wobei POST-Bodies die flexibelste und am häufigsten verwendete Methode sind, um Daten über HTTP zu senden.

Eine weitere Möglichkeit, die typischerweise für verschiedene Anwendungsfälle genutzt wird, ist die Übermittlung von Informationen mithilfe von Query-Strings oder URL-Parametern. Weitere Informationen finden Sie unter Abfragezeichenfolgen und Parameter in Express.js.

Für diesen Artikel gehe ich davon aus, dass Sie einige Erfahrung mit Node.js und der Erstellung einfacher Express.js-Server haben.

Senden von POST-Daten in HTTP

Daten können aus vielen Gründen über einen HTTP-POST-Aufruf gesendet werden, wobei einige der häufigsten über eine HTML <form> oder eine API-Anfrage erfolgen. Die Daten können verschiedene Formen annehmen, wobei die häufigste ist:

  • application/x-www-form-urlencoded: Daten in dieser Kodierung sind wie ein Abfrage-String formatiert, den Sie in einer URL sehen würden, wobei die Schlüssel-Wert-Parameter durch &-Zeichen getrennt sind. Zum Beispiel: foo=bar&abc=123&stack=abuse. Dies ist die Standardkodierung.
  • multipart/form-data: Diese Kodierung wird normalerweise für das Senden von Dateien verwendet. Kurz gesagt, jeder Schlüsselwert wird in der gleichen Anfrage gesendet, aber verschiedene „Teile“, die durch „Grenzen“ getrennt sind und mehr Metadaten enthalten.
  • text/plain: Diese Daten werden einfach als unstrukturierter Klartext gesendet und werden normalerweise nicht verwendet.

Eine rohe HTTP POST Anfrage mit der application/x-www-form-urlencoded Kodierung könnte etwa so aussehen:

POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com

Extrahieren von POST Daten

Bevor wir sofort mit dem Zugriff auf POST Daten beginnen können, müssen wir unsere Express App richtig konfigurieren. Diese Konfiguration muss vorgenommen werden, da nicht alle Webapplikationsserver Body-Parsing benötigen und es von der Anwendung abhängt, welches Body-Parsing aktiviert ist.

Um dies einzurichten, werden wir das Body-Parser-Paket verwenden, das viele Formen von Daten verarbeiten kann. Dieses Paket ist eine Middleware, die den Rohkörper abfängt und ihn in eine Form parst, die Ihr Anwendungscode leicht verwenden kann.

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.post('/post-test', (req, res) => { console.log('Got body:', req.body); res.sendStatus(200);});app.listen(8080, () => console.log(`Started server at http://localhost:8080!`));

Beachten Sie, dass wir app.use(...) aufrufen, bevor wir unsere Route definieren. Die Reihenfolge ist hier wichtig. Dadurch wird sichergestellt, dass das body-parser vor unserer Route ausgeführt wird, was gewährleistet, dass unsere Route auf den geparsten HTTP-POST-Body zugreifen kann.

Um dies zu testen, starten wir zunächst die Express-Anwendung und verwenden dann das curl-Dienstprogramm in einem anderen Konsolenfenster:

$ curl -d "username=scott&password=secret&website=stackabuse.com" -X POST http://localhost:8080/post-testOK
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

Hier können Sie sehen, dass die Query-String-Daten in ein JavaScript-Objekt geparst wurden, auf das wir problemlos zugreifen können.

Another important thing to note is our use of the extended option when calling bodyParser.urlencoded. Using the extended option tells body-parser to use the qs library to parse the URL-encoded data. This allows for things like objects and arrays to be encoded into the URL-encoded format.

And while urlencoded is one of the most commonly used parsers that body-parser provides, you can also use the following:

  • .json(): Parses JSON-formatted text for bodies with a Content-Type of application/json.
  • .raw(): Parses HTTP body in to a Buffer for specified custom Content-Types, although the default accepted Content-Type is application/octet-stream.
  • .text(): Parst HTTP-Bodys mit einem Content-Type von text/plain, das es als einfache Zeichenkette zurückgibt.

Jeder dieser Parser unterstützt auch das automatische Aufblasen von Daten, die mit gzip oder deflate kodiert sind, so dass die Komprimierung transparent und ohne zusätzliche Arbeit für den Anwendungscode verwendet werden kann.

Das Großartige am Middleware-Modell und an der Art und Weise, wie dieses Paket Daten analysiert, ist, dass Sie nicht auf die Verwendung eines einzigen Parsers festgelegt sind. Sie können einen oder mehrere Parser für Ihre Anwendung aktivieren, um sicherzustellen, dass alle Datentypen ordnungsgemäß verarbeitet werden:

// index.jsconst express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());app.use(bodyParser.raw());// ...

Wenn wir also eine HTTP POST-Anfrage mit JSON als Body senden, wird diese in ein reguläres JSON-Objekt in der req.body-Eigenschaft geparst:

POST /post-test HTTP/1.1Host: localhost:8080Content-Type: application/jsonContent-Length: 69'{"username":"scott","password":"secret","website":"stackabuse.com"}'
$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

Abschluss

Die häufigste Art, verschiedene und große Datenmengen über HTTP zu versenden, ist die Verwendung der POST-Methode. Bevor wir auf diese Daten auf der Serverseite in Express zugreifen können, müssen wir eine Middleware, wie das body-parser-Paket, verwenden, um die Daten in ein Format zu parsen, auf das wir leicht zugreifen können. Sobald die Daten aus der rohen HTTP-Anfrage geparst sind, kann über die body-Eigenschaft des req-Objekts auf sie zugegriffen werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.