Получить HTTP POST Body в Express.js

1 min


Введение

В этой краткой статье мы рассмотрим, как извлечь информацию из тела POST в Express.js. Протокол HTTP предоставляет несколько способов передачи информации от клиента к серверу, причем тела POST являются наиболее гибким и наиболее часто используемым методом отправки данных через HTTP.

Другой способ, который обычно используется для разных вариантов использования, – это передача информации с использованием строк запроса или параметров URL. Для получения дополнительной информации, проверьте, как получить строки запроса и параметры в Express.js,

В этой статье я предполагаю, что у вас есть некоторый опыт работы с Node.js и создания простых Express.js сервера.

Отправка POST-данных в HTTP

Данные могут быть отправлены через HTTP-вызов POST по многим причинам, некоторые из которых наиболее распространены через HTML

или запрос API. Данные могут принимать несколько различных форм, наиболее распространенными из которых являются:

  • application/x-www-form-urlencoded: Данные в этой кодировке форматируются как строка запроса, которую вы видите в URL, при этом разделение ключ-значение разделяется & персонажи. Например: foo=bar&abc=123&stack=abuse, Это кодировка по умолчанию.
  • multipart/form-data: Эта кодировка обычно используется для отправки файлов. Короче говоря, каждое значение ключа отправляется в одном и том же запросе, но в разных «частях», которые разделены «границами» и содержат больше метаданных.
  • text/plain: Эти данные просто отправляются в виде неструктурированного простого текста и обычно не используются.

Необработанный HTTP-запрос POST с application/x-www-form-urlencoded кодировка может выглядеть примерно так:

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

Прежде чем мы сможем сразу получить доступ к данным POST, нам необходимо правильно настроить наше приложение Express. Эту настройку необходимо выполнить, так как не все серверы веб-приложений нуждаются в анализе тела, и то, какой анализ тела включен, зависит от вашего приложения.

Чтобы настроить это, мы будем использовать тело-анализатор пакет, который может обрабатывать многие формы данных. Этот пакет является промежуточный слой он перехватывает необработанное тело и анализирует его в форме, которую может легко использовать код вашего приложения.

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

Обратите внимание, как мы называем app.use(...) до определяя наш маршрут. Порядок здесь имеет значение. Это гарантирует, что body-parser будет выполняться до нашего маршрута, что гарантирует, что наш маршрут сможет затем получить доступ к проанализированному телу HTTP POST.

Чтобы проверить это, мы сначала запустим приложение Express, а затем используем curl утилита в другом окне консоли:

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

Здесь вы можете видеть, что данные строки запроса были проанализированы в объект JavaScript, к которому мы можем легко получить доступ.

Еще одна важная вещь, которую стоит отметить, это использование extended опция при звонке bodyParser.urlencoded, С помощью extended вариант говорит body-parser использовать qs библиотека для анализа данных в кодировке URL. Это позволяет кодировать такие объекты, как объекты и массивы, в формате URL-кодирования.

И пока urlencoded это один из наиболее часто используемых парсеров body-parser обеспечивает, вы также можете использовать следующее:

  • .json(): Анализирует JSON-форматированный текст для тел с Content-Type из application/json,
  • .raw(): Анализирует тело HTTP в Buffer для указанного обычая Content-Typeс, хотя по умолчанию принято Content-Type является application/octet-stream,
  • .text(): Анализирует HTTP тела с Content-Type из text/plain, который возвращает его в виде простой строки.

Каждый из этих парсеров также поддерживает автоматическое наложение данных, закодированных GZIP или же выкачиваетТаким образом, сжатие все еще может быть прозрачно использовано без дополнительной работы кода вашего приложения.

Отличительной особенностью модели промежуточного программного обеспечения и того, как этот пакет анализирует данные, является то, что вы не привязаны к использованию только одного анализатора. Вы можете включить один или больше парсеры для вашего приложения, чтобы обеспечить правильную обработку всех типов данных:

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

// ...

Так что теперь, если мы отправим HTTP-запрос POST с JSON в качестве тела, он будет проанализирован в обычный объект JSON в req.body свойство:

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

Заключение

Наиболее распространенный способ отправки разнородных и больших объемов данных через HTTP – это использование метода POST. Прежде чем мы сможем легко получить доступ к этим данным на стороне сервера в Express, нам нужно использовать некоторое промежуточное программное обеспечение, такое как body-parser пакет, чтобы проанализировать данные в формате, который мы можем легко получить доступ. После анализа данных из необработанного HTTP-запроса к ним можно получить доступ через body собственность req объект.

В этой статье мы немного объяснили различные типы контента / кодировки, как использовать body-parser пакет и его различные параметры, и как получить доступ к проанализированным данным. Если вы видите какие-либо проблемы или у вас есть предложения, не стесняйтесь оставлять комментарии ниже.


0 Comments

Ваш e-mail не будет опубликован. Обязательные поля помечены *