Node.js
Как в Node.js передать POST-параметры без JSON
Короткий ответ: если API не принимает JSON, чаще всего ему нужны данные в формате application/x-www-form-urlencoded или multipart/form-data. Для простых текстовых параметров используйте URLSearchParams, а на стороне Express включите express.urlencoded()
Запрос «как в node js передать post запросом параметры в некотором api не используя json» звучит узко, но ситуация частая: старый API, платежная форма, OAuth, CRM или внешний сервис ожидает не JSON-тело, а обычные form-поля
Чем отличается JSON от form-urlencoded
JSON-запрос выглядит так
{
"name": "Dinar",
"email": "test@example.com"
}
А application/x-www-form-urlencoded выглядит как строка формы
name=Dinar&email=test%40example.com
В обоих случаях данные передаются в теле POST-запроса, но сервер читает их по-разному
Отправка POST без JSON через fetch
В современных версиях Node.js доступен fetch. Пример отправки form-urlencoded
const params = new адресSearchParams();
params.append("name", "Dinar");
params.append("email", "test@example.com");
const response = await fetch("https://example.com/api/form", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: params
});
const text = await response.text();
console.log(text);
URLSearchParams сам кодирует специальные символы, например @ в email
Как принять такие данные в Express
Серверный пример
const express = require("express");
const app = express();
app.use(express.urlencoded({ extended: false }));
app.post("/form", (request, response) => {
console.log(request.body);
response.json({
received: request.body
});
});
app.listen(3000, () => {
console.log("Сервер запущен: http://localhost:3000");
});
Проверка через curl
curl -X POST http://localhost:3000/form \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "name=Dinar&email=test@example.com"
Если Express настроен правильно, request.body будет объектом с полями name и email
Когда нужен multipart/form-data
Если передаете файлы, одного URLSearchParams недостаточно. Для файлов обычно используют multipart/form-data. В браузере это делает FormData, а в Node.js тоже можно использовать FormData, если версия и окружение это поддерживают
Пример для текстовых полей
const formData = new FormData();
formData.append("name", "Dinar");
formData.append("comment", "Тестовая заявка");
const response = await fetch("https://example.com/api/form", {
method: "POST",
body: formData
});
Для файлов в реальном проекте нужно отдельно учитывать чтение файла, типы и ограничения API
Почему не стоит вручную склеивать строку
Плохой вариант
const body = "name=" + name + "&email=" + email;
Если в имени будет пробел, амперсанд или кириллица, запрос может сломаться. URLSearchParams кодирует значения корректнее
Как понять, какой формат нужен API
Смотрите документацию API. Обычно там прямо указано одно из значений
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data
Если API ждет application/x-www-form-urlencoded, отправка JSON не сработает, даже если набор полей одинаковый
Мини-практика
Сделайте локальный Express-маршрут /form, включите express.urlencoded, отправьте данные через curl, затем отправьте те же данные из Node.js через fetch и URLSearchParams
Так вы увидите обе стороны: клиент, который отправляет форму, и сервер, который ее принимает
Частые ошибки
request.body пустой Проверьте, подключили ли express.urlencoded() до маршрута
API отвечает, что параметров нет Проверьте Content-Type. Возможно, вы отправили JSON вместо формы
Кириллица или email ломаются Используйте URLSearchParams, а не ручную склейку строки
Смешали JSON и form-urlencoded Если в заголовке form-urlencoded, тело должно быть form-urlencoded. Если в заголовке JSON, тело должно быть JSON-строкой
Что почитать дальше по Node.js
Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:
- Node.js + MySQL: REST API для первых данных
- Как обновить Node.js без боли
- Как обновить Node.js на Linux и Ubuntu без поломки проекта
- Как перенести Node.js-проект в сеть без интернета