Что кладешь в body что нельзя положить в query-параметры при запросе

Ответ

В body можно передавать любые данные, включая бинарные (например, файлы), сложные структуры (JSON, XML) или большие объемы данных. В query-параметрах ограничения:

  1. Длина URL – браузеры/серверы имеют лимиты (~2000 символов)
  2. Типы данных – query-параметры всегда строки, сложные структуры нужно сериализовать
  3. Безопасность – query виден в URL, логируется, не подходит для sensitive data

Пример POST с JSON в body:

fetch('/api/data', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ user: 'admin', pass: 'secret' })
});

То же через query (не рекомендуется!):

GET /api/data?user=admin&pass=secret

Ответ 18+ 🔞

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

Представь, что body — это твой личный грузовик, куда ты можешь запихнуть что угодно. Хоть диван, хоть десять мешков картошки, хоть ящик с хрупкими ёлочными игрушками. Всё, что влезет, поедет. JSON, файлы, XML — да хоть фотографию своей тёщи в бинарном виде. Главное, правильно упаковать и сказать, что везешь (это вот Content-Type в заголовках).

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

  1. Длина URL, ёпта. Браузеры и серверы смотрят на эту длиннющую строку и думают: "Ну нахуй, это уже перебор". Лимит где-то около 2000 символов. Напишешь роман в параметрах — обреже́т к хуям.
  2. Типы данных. В карман (query) ты можешь сунуть только монетки (строки). А как туда, блядь, сложный объект с вложенными массивами запихнуть? Придётся его сплющить и склеить в одну строку, а на той стороне опять разбирать. Геморрой же!
  3. Безопасность. Это самое главное! URL — он как объявление на заборе. Его все видят: в истории браузера, в логах сервера, в адресной строке. Ты что, серьёзно хочешь туда пароль или номер карты пихать? Это ж пиздец, а не подход.

Смотри, как правильно, по-взрослому, отправить данные (например, логин и пароль) в body:

fetch('/api/data', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ user: 'admin', pass: 'secret' })
});

Всё аккуратно, секретно, в закрытом контейнере едет.

А вот как делают ебалаи, пихая всё в query (НЕ ДЕЛАЙ ТАК, Я СЕРЬЁЗНО!):

GET /api/data?user=admin&pass=secret

Представляешь? Этот URL будет светиться везде, как ёлка на Красной площади. Любой, кто увидит историю или логи, сразу всё узнает. Доверия к такому подходу — ноль ебать.

Короче, запомни: для всего большого, сложного или секретного — только body. А query — для мелких, неважных и публичных штук, вроде ?page=2&sort=name. Всё, вопрос закрыт, иди работай.