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. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x