Získejte tělo HTTP POST v Express.js

Úvod

V tomto krátkém článku se podíváme na to, jak extrahovat informace z těla POST v Express.js. Protokol HTTP poskytuje řadu způsobů, jak předávat informace z klienta na server, přičemž těla POST jsou nejflexibilnější a nejběžněji používanou metodou pro odesílání dat přes 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 najdete v článku o tom, jak získat řetězce dotazů a parametry v Express.js.

U tohoto článku 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 HTTP

Data lze odesílat prostřednictvím volání HTTP POST z mnoha důvodů, přičemž některé z nejběžnějších jsou prostřednictvím HTML <form> nebo požadavek API. Data mohou mít několik různých forem, 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ý vidíte v adrese URL, přičemž pár klíč–hodnota je oddělený & 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ý pár klíč–hodnota je odeslán ve stejném požadavku, ale různé „části“, které jsou odděleny „hranicemi“ a obsahují více metadat.
  • text/plain :Tato data jsou pouze odesílána jako nestrukturovaný prostý text a obvykle se nepoužívají.

Nezpracovaný požadavek HTTP POST s application/x-www-form-urlencoded kódování může vypadat nějak takto:

POST /signup HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 53

username=scott&password=secret&website=stackabuse.com

Extrahování dat POST

Než budeme moci okamžitě 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í analýzu těla a to, jaká analýza těla je povolena, závisí na vaší aplikaci.

K nastavení použijeme balíček body-parser, který zvládne mnoho forem dat. Tento balíček je middleware, který zachycuje nezpracované tělo a analyzuje jej do podoby, kterou může kód vaší aplikace snadno použít.

// index.js
const 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 nazýváme app.use(...) před určující naši trasu. Na pořadí zde záleží. Tím zajistíte, že body-parser poběží před naší trasou, což zajistí, že naše trasa bude mít přístup k analyzovanému tělu HTTP POST.

Abychom to otestovali, nejprve spustíme aplikaci Express a poté použijeme curl nástroj v jiném okně konzoly:

$ curl -d "username=scott&password=secret&website=stackabuse.com" -X POST http://localhost:8080/post-test
OK
$ node index.js
Started 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 analyzována do objektu JavaScript, ke kterému máme snadný přístup.

Další důležitou věcí, kterou je třeba poznamenat, je naše použití extended možnost při volání bodyParser.urlencoded . Pomocí extended volba říká body-parser použít qs knihovna pro analýzu dat zakódovaných v URL. To umožňuje věci, jako jsou objekty a pole, zakódovat do formátu zakódovaného URL.

A zatímco urlencoded je jedním z nejčastěji používaných analyzátorů body-parser poskytuje, můžete také použít následující:

  • .json() :Analyzuje text ve formátu JSON pro těla s Content-Type z application/json .
  • .raw() :Analyzuje tělo HTTP do Buffer pro zadané vlastní Content-Type s, ačkoli ve výchozím nastavení je akceptováno Content-Type je application/octet-stream .
  • .text() :Analyzuje těla HTTP s Content-Type z text/plain , který jej vrátí jako prostý řetězec.

Každý z těchto analyzátorů také podporuje automatickou inflaci dat zakódovaných pomocí gzip nebo deflate, takže kompresi lze stále transparentně používat bez další práce s kódem vaší aplikace.

Zdarma e-kniha:Git Essentials

Prohlédněte si našeho praktického průvodce učením Git s osvědčenými postupy, průmyslově uznávanými standardy a přiloženým cheat sheetem. Přestaňte používat příkazy Google Git a skutečně se naučte to!

Skvělá věc na modelu middlewaru a na tom, jak tento balíček analyzuje data, je, že nemusíte používat pouze jeden analyzátor. Můžete povolit jeden nebo více analyzátory pro vaši aplikaci, abyste zajistili správné zpracování všech typů dat:

// index.js
const 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 analyzován do běžného objektu JSON v req.body vlastnost:

POST /post-test HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Content-Length: 69

'{"username":"scott","password":"secret","website":"stackabuse.com"}'
$ node index.js
Started 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 přes HTTP je použití metody POST. Než budeme mít snadný přístup k těmto datům na straně serveru v Express, musíme použít nějaký middleware, jako je body-parser balíček, analyzovat data do formátu, ke kterému máme snadný přístup. Jakmile jsou data z nezpracovaného požadavku HTTP analyzována, lze k nim přistupovat prostřednictvím body vlastnost req objekt.

V tomto článku jsme trochu vysvětlili různé typy/kódování obsahu, jak používat body-parser balíček a jeho různé možnosti a jak získat přístup k analyzovaným datům. Pokud narazíte na nějaké problémy nebo máte návrhy, neváhejte zanechat komentář níže.