Bevezetés
Ezzel a rövid cikkel áttekintjük, hogyan nyerhetünk információt egy POST testből az Express.js-ben. A HTTP protokoll számos módot biztosít arra, hogy információt továbbítsunk egy klienstől egy szerver felé, a POST test a legrugalmasabb és leggyakrabban használt módszer a HTTP-n keresztüli adatátvitelre.
A másik mód, amelyet jellemzően különböző felhasználási esetekben használunk, az információ továbbítása lekérdezési karakterláncok vagy URL paraméterek segítségével. További információért nézze meg, hogyan kaphatunk lekérdezési karakterláncokat és paramétereket az Express.js-ben.
Ezért a cikkért feltételezem, hogy van némi tapasztalata a Node.js-ben és egyszerű Express.js kiszolgálók létrehozásában.
POST adatok küldése HTTP-ben
Az adatokat HTTP POST hívással sokféle okból lehet küldeni, a leggyakoribbak közé tartozik a HTML <form>
vagy egy API-kérés. Az adatok többféle formát ölthetnek, a leggyakoribbak a következők:
-
application/x-www-form-urlencoded
: Az adatok ebben a kódolásban úgy vannak formázva, mint egy URL-ben látható lekérdezési karakterlánc, a kulcs-értékeket&
karakterekkel elválasztva. Például:foo=bar&abc=123&stack=abuse
. Ez az alapértelmezett kódolás. -
multipart/form-data
: Ezt a kódolást általában fájlok küldésére használják. Röviden, minden egyes kulcs-értéket ugyanabban a kérésben küldenek, de különböző “részeket”, amelyeket “határokkal” választanak el, és több metaadatot tartalmaznak. -
text/plain
: Ezt az adatot csak strukturálatlan egyszerű szövegként küldik, és jellemzően nem használják.
Egy nyers HTTP POST-kérés a application/x-www-form-urlencoded
kódolással valahogy így nézhet ki:
POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com
POST-adatok kinyerése
Mielőtt azonnal elkezdenénk a POST-adatok elérését, megfelelően konfigurálnunk kell az Express alkalmazásunkat. Ezt a konfigurációt azért kell elvégezni, mert nem minden webes alkalmazás szerverének van szüksége testelemzésre, és az, hogy milyen testelemzést engedélyezünk, az alkalmazásunktól függ.
A beállításhoz a body-parser csomagot fogjuk használni, amely számos adatformát képes kezelni. Ez a csomag egy middleware, amely elfogja a nyers testet, és olyan formára elemzi, amelyet az alkalmazáskódod könnyen felhasználhat.
// 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!`));
Nézd meg, hogyan hívjuk meg a app.use(...)
, mielőtt definiálnánk az útvonalunkat. A sorrend itt számít. Ez biztosítja, hogy a body-parser
az útvonalunk előtt fusson, ami biztosítja, hogy az útvonalunk ezután hozzáférhessen az elemzett HTTP POST testhez.
Azért, hogy ezt teszteljük, először elindítjuk az Express alkalmazást, majd egy másik konzolablakban használjuk a curl
segédprogramot:
$ 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' }
Itt láthatjuk, hogy a lekérdezési karakterlánc adatait egy JavaScript objektumba elemeztük, amelyet könnyen elérhetünk.
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()
: AContent-Type
atext/plain
HTTP testeket elemzi, és egyszerű karakterláncként adja vissza.
Mindegyik elemző támogatja a gzip vagy deflate kódolású adatok automatikus felfújását is, így a tömörítés továbbra is átláthatóan használható, anélkül, hogy az alkalmazáskód külön munkát végezne.
A middleware modellben és abban, ahogyan ez a csomag elemzi az adatokat, az a nagyszerű, hogy nem ragaszkodik egyetlen elemző használatához. Engedélyezhetsz egy vagy több elemzőt az alkalmazásod számára, hogy minden adattípus megfelelő feldolgozását biztosítsd:
// 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());// ...
Így most, ha elküldenénk egy HTTP POST kérést JSON testtel, akkor azt a req.body
tulajdonságban egy hagyományos JSON objektumba elemzi:
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' }
Következtetés
A HTTP-n keresztül történő változatos és nagy mennyiségű adat küldésének leggyakoribb módja a POST módszer használata. Mielőtt könnyen hozzáférhetnénk ezekhez az adatokhoz a szerveroldalon az Expressben, szükségünk van valamilyen middleware-re, például a body-parser
csomagra, hogy az adatokat olyan formátumba elemezzük, amelyhez könnyen hozzáférhetünk. Miután a nyers HTTP-kérésből származó adatokat elemeztük, azok a body
objektum req
tulajdonságán keresztül elérhetők.