Obținerea corpului HTTP POST în Express.js

Introducere

În acest scurt articol vom trece în revistă cum să extragem informații dintr-un corp POST în Express.js. Protocolul HTTP oferă o serie de modalități de a transmite informații de la un client la un server, corpurile POST fiind cea mai flexibilă și cea mai frecvent utilizată metodă de a trimite date prin HTTP.

O altă modalitate, care este utilizată de obicei pentru diferite cazuri de utilizare, este de a transmite informații utilizând șiruri de interogare sau parametri URL. Pentru mai multe informații, consultați modul de obținere a șirurilor de interogare și a parametrilor în Express.js.

Pentru acest articol presupun că aveți o anumită experiență cu Node.js și cu crearea de servere Express.js simple.

În trimiterea de date POST în HTTP

Datele pot fi trimise prin intermediul unui apel HTTP POST din mai multe motive, unele dintre cele mai comune fiind prin intermediul unui HTML <form> sau a unei cereri API. Datele pot lua câteva forme diferite, cele mai frecvente fiind:

  • application/x-www-form-urlencoded: Datele în această codificare sunt formatate ca un șir de interogare pe care l-ați vedea într-un URL, cu parale de valori cheie separate de caractere &. De exemplu: foo=bar&abc=123&stack=abuse. Aceasta este codificarea implicită.
  • multipart/form-data: Această codificare este utilizată de obicei pentru trimiterea de fișiere. Pe scurt, fiecare valoare-cheie este trimisă în aceeași cerere, dar cu „părți” diferite, care sunt separate de „granițe” și includ mai multe metadate.
  • text/plain: Aceste date sunt doar trimise ca text simplu nestructurat și, de obicei, nu sunt utilizate.

O cerere HTTP POST brută cu codificarea application/x-www-form-urlencoded ar putea arăta cam așa:

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

Extragerea datelor POST

Înainte de a începe să accesăm imediat datele POST, trebuie să configurăm corect aplicația noastră Express. Această configurare trebuie făcută deoarece nu toate serverele aplicațiilor web au nevoie de analiza corpului, iar analiza corpului activată depinde de aplicația dumneavoastră.

Pentru a configura acest lucru, vom folosi pachetul body-parser, care poate gestiona multe forme de date. Acest pachet este un middleware care interceptează corpul brut și îl analizează într-o formă pe care codul aplicației dvs. o poate utiliza cu ușurință.

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

Rețineți cum apelăm app.use(...) înainte de a ne defini traseul. Ordinea de aici contează. Acest lucru va asigura că body-parser se va executa înaintea traseului nostru, ceea ce asigură că traseul nostru poate accesa apoi corpul HTTP POST analizat.

Pentru a testa acest lucru, vom porni mai întâi aplicația Express și apoi vom folosi utilitarul curl într-o altă fereastră de consolă:

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

Aici puteți vedea că datele din șirul de interogare au fost analizate într-un obiect JavaScript pe care îl putem accesa cu ușurință.

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(): Analizează corpurile HTTP cu un Content-Type de text/plain, care îl returnează ca un șir simplu.

Care dintre aceste analizoare suportă, de asemenea, umflarea automată a datelor codificate cu gzip sau deflate, astfel încât compresia poate fi în continuare utilizată în mod transparent fără muncă suplimentară din partea codului aplicației dumneavoastră.

Ceea ce este grozav la modelul middleware și la modul în care acest pachet analizează datele este că nu sunteți blocat să folosiți doar un singur parser. Puteți activa unul sau mai multe analizoare pentru aplicația dvs. pentru a vă asigura că toate tipurile de date sunt procesate în mod corespunzător:

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

Acum, dacă ar fi să trimitem o cerere HTTP POST cu JSON ca și corp, acesta va fi analizat într-un obiect JSON obișnuit în proprietatea req.body:

$ node index.jsStarted server at http://localhost:8080!Got body: { username: 'scott', password: 'secret', website: 'stackabuse.com' }

Concluzie

Cel mai comun mod de a trimite diverse și mari cantități de date prin HTTP este de a folosi metoda POST. Înainte de a putea accesa cu ușurință aceste date pe partea serverului în Express, trebuie să folosim un middleware, cum ar fi pachetul body-parser, pentru a analiza datele într-un format pe care să îl putem accesa cu ușurință. Odată ce datele din cererea HTTP brută sunt analizate, acestea pot fi accesate prin intermediul proprietății body a obiectului req.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.