Hämta HTTP POST Body i Express.js

Inledning

I den här korta artikeln går vi igenom hur man extraherar information från en POST body i Express.js. HTTP-protokollet erbjuder ett antal sätt att överföra information från en klient till en server, där POST-korpusar är den mest flexibla och vanligaste metoden för att skicka data via HTTP.

Ett annat sätt, som vanligtvis används för olika användningsområden, är att förmedla information med hjälp av frågeslingor eller URL-parametrar. För mer information, kolla in hur man får fram query strings och parametrar i Express.js.

För den här artikeln antar jag att du har viss erfarenhet av Node.js och av att skapa enkla Express.js-servrar.

Sändning av POST-data i HTTP

Data kan sändas via ett HTTP POST-anrop av många anledningar, där några av de vanligaste är via en HTML <form> eller en API-förfrågan. Uppgifterna kan ha några olika former, där de vanligaste är:

  • application/x-www-form-urlencoded: Data i den här kodningen är formaterad som en frågeteckensträng som du skulle se i en URL, där nyckelvärdena paris separeras med &-tecken. Till exempel: foo=bar&abc=123&stack=abuse. Detta är standardkodningen.
  • multipart/form-data: Denna kodning används vanligtvis för att skicka filer. Kort sagt skickas varje nyckelvärde i samma begäran, men olika ”delar”, som skiljs åt av ”gränser” och innehåller mer metadata.
  • text/plain: Dessa data skickas bara som ostrukturerad vanlig text och används vanligtvis inte.

En rå HTTP POST-förfrågan med application/x-www-form-urlencoded-kodningen kan se ut ungefär så här:

POST /signup HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 53username=scott&password=secret&website=stackabuse.com

Extrahera POST-data

För att vi ska kunna komma åt POST-data direkt måste vi konfigurera vår Express-app korrekt. Denna konfiguration måste göras eftersom inte alla webbapplikationsservrar behöver body parsing, och vilken body parsing som är aktiverad beror på din applikation.

För att ställa in detta kommer vi att använda paketet body-parser, som kan hantera många former av data. Det här paketet är en middleware som fångar upp den råa kroppen och analyserar den i en form som din programkod enkelt kan använda.

// 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!`));

Se hur vi anropar app.use(...) innan vi definierar vår rutt. Ordningen är viktig här. Detta säkerställer att body-parser körs före vår rutt, vilket säkerställer att vår rutt sedan kan få tillgång till den analyserade HTTP POST-kroppen.

För att testa detta startar vi först Express-appen och använder sedan verktyget curl i ett annat konsolfönster:

$ 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' }

Här kan du se att data från förfrågningssträngen parsades in i ett JavaScript-objekt som vi enkelt kan komma åt.

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(): Parsar HTTP-kroppar med en Content-Type av text/plain, som returnerar den som en vanlig sträng.

Varje parsare har också stöd för automatisk uppblåsning av data som är kodade med gzip eller deflate, så att komprimering fortfarande kan användas på ett transparent sätt utan att programkoden behöver göra något extra arbete.

Det fina med middleware-modellen och hur det här paketet analyserar data är att du inte är bunden till att använda bara en analysator. Du kan aktivera en eller flera parsers för din app för att se till att alla datatyper behandlas korrekt:

Så om vi nu skulle skicka en HTTP POST-begäran med JSON som kropp kommer den att parsas till ett vanligt JSON-objekt i egenskapen 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' }

Slutsats

Det vanligaste sättet att skicka olika och stora mängder data via HTTP är att använda POST-metoden. Innan vi enkelt kan få tillgång till dessa data på serversidan i Express måste vi använda någon middleware, som body-parser-paketet, för att analysera data i ett format som vi enkelt kan få tillgång till. När data från den råa HTTP-förfrågan har parsats kan den sedan nås via body-egenskapen för req-objektet.

Lämna ett svar

Din e-postadress kommer inte publiceras.