Obtenir le corps POST HTTP dans Express.js

Introduction

Dans ce bref article, nous allons passer en revue comment extraire des informations d’un corps POST dans Express.js. Le protocole HTTP fournit un certain nombre de façons de transmettre des informations d’un client à un serveur, les corps POST étant la méthode la plus flexible et la plus couramment utilisée pour envoyer des données via HTTP.

Une autre façon, qui est généralement utilisée pour différents cas d’utilisation, est de transmettre des informations en utilisant des chaînes de requête ou des paramètres d’URL. Pour plus d’infos, consultez comment obtenir des chaînes de requête et des paramètres dans Express.js.

Pour cet article, je suppose que vous avez une certaine expérience avec Node.js et la création de serveurs Express.js simples.

Envoyer des données POST en HTTP

Les données peuvent être envoyées via un appel HTTP POST pour de nombreuses raisons, certaines des plus courantes étant via un HTML <form> ou une requête API. Les données peuvent prendre plusieurs formes différentes, les plus courantes étant :

  • application/x-www-form-urlencoded : Les données dans cet encodage sont formatées comme une chaîne de requête que vous verriez dans une URL, les paris clés-valeurs étant séparés par des caractères &. Par exemple : foo=bar&abc=123&stack=abuse. C’est l’encodage par défaut.
  • multipart/form-data : Cet encodage est généralement utilisé pour l’envoi de fichiers. En bref, chaque valeur-clé est envoyée dans la même requête, mais différentes « parties », qui sont séparées par des « frontières » et incluent davantage de métadonnées.
  • text/plain : Ces données sont juste envoyées sous forme de texte brut non structuré, et ne sont généralement pas utilisées.

Une requête HTTP POST brute avec l’encodage application/x-www-form-urlencoded pourrait ressembler à quelque chose comme ceci:

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

Extraction des données POST

Avant de pouvoir commencer à accéder aux données POST immédiatement, nous devons configurer correctement notre application Express. Cette configuration doit être faite car tous les serveurs d’applications web n’ont pas besoin de l’analyse du corps, et ce que l’analyse du corps est activée dépend de votre application.

Pour mettre cela en place, nous allons utiliser le package body-parser, qui peut traiter de nombreuses formes de données. Ce paquet est un intergiciel qui intercepte le corps brut et l’analyse en une forme que le code de votre application peut facilement utiliser.

// 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!`));

Voyez comment nous appelons app.use(...) avant de définir notre route. L’ordre ici est important. Cela garantit que la body-parser s’exécutera avant notre route, ce qui garantit que notre route peut ensuite accéder au corps HTTP POST analysé.

Pour tester cela, nous allons d’abord lancer l’application Express, puis utiliser l’utilitaire curl dans une autre fenêtre de console :

$ 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' }

Ici, vous pouvez voir que les données de la chaîne de requête ont été analysées dans un objet JavaScript auquel nous pouvons facilement accéder.

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(): Analyse les corps HTTP avec un Content-Type de text/plain, qui le renvoie sous la forme d’une chaîne simple.

Chacun de ces analyseurs prend également en charge le gonflement automatique des données encodées avec gzip ou deflate, de sorte que la compression peut toujours être utilisée de manière transparente sans travail supplémentaire de la part du code de votre application.

Ce qui est génial avec le modèle d’intergiciel et la façon dont ce paquet analyse les données, c’est que vous n’êtes pas coincé à utiliser un seul analyseur. Vous pouvez activer un ou plusieurs analyseurs pour votre application afin de vous assurer que tous les types de données sont traités correctement :

// 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());// ...

Alors maintenant, si nous devions envoyer une requête HTTP POST avec JSON comme corps, elle sera analysée en un objet JSON ordinaire dans la propriété req.body :

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' }

Conclusion

La façon la plus courante d’envoyer des données diverses et volumineuses via HTTP est d’utiliser la méthode POST. Avant de pouvoir accéder facilement à ces données côté serveur dans Express, nous devons utiliser un intergiciel, comme le paquet body-parser, pour analyser les données dans un format auquel nous pouvons facilement accéder. Une fois les données de la requête HTTP brute analysées, on peut y accéder via la propriété body de l’objet req.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.