Úvod
V tomto krátkém článku se budeme zabývat tím, jak získat informace z těla POST v Express.js. Protokol HTTP poskytuje řadu způsobů předávání informací od klienta k serveru, přičemž těla POST jsou nejflexibilnější a nejčastěji používanou metodou odesílání dat prostřednictvím protokolu HTTP.
Dalším způsobem, který se obvykle používá pro různé případy použití, je předávání informací pomocí řetězců dotazů nebo parametrů URL. Další informace naleznete v článku Jak získat řetězce dotazů a parametry v Express.js.
Pro tento článek předpokládám, že máte nějaké zkušenosti s Node.js a vytvářením jednoduchých serverů Express.js.
Odesílání dat POST v protokolu HTTP
Data lze odeslat prostřednictvím volání HTTP POST z mnoha důvodů, přičemž mezi nejčastější patří odeslání prostřednictvím HTML <form>
nebo požadavku API. Data mohou mít několik různých podob, přičemž nejběžnější jsou:
-
application/x-www-form-urlencoded
: Data v tomto kódování jsou formátována jako řetězec dotazu, který se zobrazuje v adrese URL, přičemž parity klíč-hodnota jsou odděleny znaky&
. Například:foo=bar&abc=123&stack=abuse
. Toto je výchozí kódování. -
multipart/form-data
: Toto kódování se obvykle používá pro odesílání souborů. Stručně řečeno, každá hodnota klíče je odeslána ve stejném požadavku, ale v různých „částech“, které jsou odděleny „hranicemi“ a obsahují další metadata. -
text/plain
: Tato data jsou odesílána pouze jako nestrukturovaný prostý text a obvykle se nepoužívají.
Surový požadavek HTTP POST s kódováním application/x-www-form-urlencoded
může vypadat takto:
POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com
Extrahování dat POST
Než budeme moci hned začít přistupovat k datům POST, musíme správně nakonfigurovat naši aplikaci Express. Tuto konfiguraci je třeba provést, protože ne všechny servery webových aplikací potřebují parsování těla a to, jaké parsování těla je povoleno, závisí na vaší aplikaci.
Pro nastavení budeme používat balíček body-parser, který dokáže zpracovat mnoho forem dat. Tento balíček je middleware, který zachytí surové tělo a rozebere je do podoby, kterou může kód vaší aplikace snadno použít.
// 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!`));
Všimněte si, jak před definováním naší trasy voláme app.use(...)
. Na pořadí zde záleží. Tím zajistíme, že body-parser
bude spuštěn před naší trasou, což zajistí, že naše trasa pak bude mít přístup k analyzovanému tělu HTTP POST.
Pro otestování tohoto postupu nejprve spustíme aplikaci Express a poté použijeme nástroj curl
v jiném okně konzoly:
$ 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' }
Zde můžete vidět, že data řetězce dotazu byla rozebrána do objektu JavaScriptu, ke kterému můžeme snadno přistupovat.
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()
: Parsuje těla HTTP sContent-Type
ztext/plain
, který je vrátí jako prostý řetězec.
Každý z těchto parserů také podporuje automatické nafukování dat kódovaných pomocí gzip nebo deflate, takže kompresi lze stále transparentně používat bez další práce kódu aplikace.
Skvělé na modelu middlewaru a způsobu, jakým tento balík analyzuje data, je to, že nejste odkázáni na používání pouze jednoho parseru. Pro svou aplikaci můžete povolit jeden nebo více parserů, abyste zajistili správné zpracování všech typů dat:
// 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());// ...
Pokud bychom tedy nyní odeslali požadavek HTTP POST s tělem JSON, bude rozebrán na běžný objekt JSON ve vlastnosti 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' }
Závěr
Nejběžnějším způsobem odesílání různorodých a velkých objemů dat prostřednictvím protokolu HTTP je použití metody POST. Než budeme moci k těmto datům snadno přistupovat na straně serveru v aplikaci Express, musíme použít nějaký middleware, například balíček body-parser
, který data rozebere do formátu, k němuž můžeme snadno přistupovat. Jakmile jsou data ze surového požadavku HTTP rozebrána, můžeme k nim přistupovat prostřednictvím vlastnosti body
objektu req
.