Get HTTP POST Body in Express.js

Wprowadzenie

W tym krótkim artykule zajmiemy się tym, jak wyodrębnić informacje z ciała POST w Express.js. Protokół HTTP zapewnia wiele sposobów na przekazywanie informacji od klienta do serwera, przy czym ciała POST są najbardziej elastyczną i najczęściej używaną metodą wysyłania danych przez HTTP.

Innym sposobem, który jest zazwyczaj używany w różnych przypadkach, jest przekazywanie informacji za pomocą ciągów zapytań lub parametrów URL. Aby uzyskać więcej informacji, sprawdź, jak uzyskać ciągi zapytań i parametry w Express.js.

Do tego artykułu zakładam, że masz pewne doświadczenie z Node.js i tworzeniem prostych serwerów Express.js.

Wysyłanie danych POST w HTTP

Dane mogą być wysyłane poprzez wywołanie HTTP POST z wielu powodów, z niektórymi z najczęstszych, takimi jak HTML <form> lub żądanie API. Dane mogą przybierać kilka różnych form, z których najczęstsze to:

  • application/x-www-form-urlencoded: Dane w tym kodowaniu są sformatowane jak ciąg zapytania, który zobaczyłbyś w adresie URL, z parami klucz-wartość oddzielonymi znakami &. Na przykład: foo=bar&abc=123&stack=abuse. Jest to domyślne kodowanie.
  • multipart/form-data: To kodowanie jest zwykle używane do wysyłania plików. W skrócie, każdy klucz-wartość jest wysyłany w tym samym żądaniu, ale różne „części”, które są oddzielone „granicami” i zawierają więcej meta-danych.
  • text/plain: Te dane są po prostu wysyłane jako nieuporządkowany zwykły tekst i zazwyczaj nie są używane.

Rzetelne żądanie HTTP POST z kodowaniem application/x-www-form-urlencoded może wyglądać mniej więcej tak:

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

Wyciąganie danych POST

Zanim będziemy mogli zacząć od razu uzyskiwać dostęp do danych POST, musimy odpowiednio skonfigurować naszą aplikację Express. Konfiguracja ta jest konieczna, ponieważ nie wszystkie serwery aplikacji internetowych wymagają parsowania ciała, a to jakie parsowanie ciała jest włączone zależy od twojej aplikacji.

Aby to skonfigurować, będziemy używać pakietu body-parser, który może obsługiwać wiele form danych. Pakiet ten jest oprogramowaniem pośredniczącym, które przechwytuje surowe ciało i przetwarza je do postaci, którą kod aplikacji może łatwo wykorzystać.

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

Zauważ, że wywołujemy app.use(...) przed zdefiniowaniem naszej trasy. Kolejność ma tutaj znaczenie. Zapewni to, że body-parser zostanie uruchomiony przed naszą trasą, co zapewni, że nasza trasa będzie miała dostęp do sparsowanego ciała HTTP POST.

Aby to przetestować, najpierw uruchomimy aplikację Express, a następnie użyjemy narzędzia curl w innym oknie konsoli:

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

W tym miejscu widać, że dane z łańcucha zapytania zostały przetworzone na obiekt JavaScript, do którego możemy łatwo uzyskać dostęp.

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(): Parsuje ciała HTTP z Content-Type z text/plain, który zwraca go jako zwykły ciąg znaków.

Każdy z tych parserów obsługuje również automatyczną inflację danych zakodowanych za pomocą gzip lub deflate, więc kompresja może być nadal przezroczyście używana bez dodatkowej pracy kodu aplikacji.

Wspaniałą rzeczą w modelu middleware i sposobie w jaki ten pakiet przetwarza dane jest to, że nie jesteś przyklejony do używania tylko jednego parsera. Możesz włączyć jeden lub więcej parserów dla swojej aplikacji, aby zapewnić, że wszystkie typy danych są przetwarzane poprawnie:

// 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());// ...

Więc teraz, jeśli wysłalibyśmy żądanie HTTP POST z JSON jako ciałem, zostanie ono przetworzone na zwykły obiekt JSON we właściwości 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' }

Podsumowanie

Najczęstszym sposobem wysyłania zróżnicowanych i dużych ilości danych przez HTTP jest użycie metody POST. Zanim będziemy mogli w prosty sposób uzyskać dostęp do tych danych po stronie serwera w Expressie, musimy użyć pewnego oprogramowania pośredniczącego, takiego jak pakiet body-parser, aby przetworzyć dane do formatu, do którego będziemy mieli łatwy dostęp. Gdy dane z surowego żądania HTTP są już przetworzone, można się do nich dostać poprzez właściwość body obiektu req.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.