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 aContent-Type
ofapplication/json
. -
.raw()
: Parses HTTP body in to aBuffer
for specified customContent-Type
s, although the default acceptedContent-Type
isapplication/octet-stream
. -
.text()
: Analizează corpurile HTTP cu unContent-Type
detext/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
.
.