HTTP POST test kinyerése Express.js-ben

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 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(): A Content-Type a text/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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.