Ответ
Согласно семантике HTTP, методы GET, HEAD и OPTIONS не должны иметь тела запроса. Метод DELETE может иметь тело, но на практике оно часто игнорируется.
Почему так и как это работает в Node.js (Express):
- GET & HEAD: Предназначены только для получения данных или заголовков. Серверы (и промежуточное ПО вроде
body-parser) обычно игнорируют тело для этих методов. - OPTIONS: Используется для запроса информации о поддерживаемых методах (CORS). Тело не требуется.
Пример в Express:
const express = require('express');
const app = express();
app.use(express.json()); // body-parser для JSON
// Middleware body-parser НЕ будет парсить тело для GET запроса
app.get('/api/users', (req, res) => {
// req.body будет пустым объектом {} или undefined, даже если клиент отправил тело
console.log(req.body); // {}
res.json({ users: [] });
});
// Для передачи данных в GET-запросе используйте query-параметры
// GET /api/users?name=John&age=30
Передача параметров для этих методов должна осуществляться через URL (path или query-параметры), что соответствует RESTful-практикам и обеспечивает кэшируемость запросов.
Ответ 18+ 🔞
А, ну это классика, блядь! Сейчас объясню на пальцах, как это работает, а то народ постоянно наступает на одни и те же грабли.
Смотри, есть в HTTP такие методы, которые по своей природе просто не должны таскать с собой тело запроса. Это как прийти в магазин за хлебом с пустой сумкой — ты же только спросить пришёл, а не груз привезти. К этим методам относятся GET, HEAD и OPTIONS. Метод DELETE — тот ещё подозрительный тип: тело ему можно прицепить, но сервера часто делают вид, что его нет, игнорируют нахуй. Доверия к телу в DELETE — ноль ебать.
А почему так, спросишь?
- GET & HEAD: Их работа — тупо получить данные или заголовки. Сервер, увидев такой запрос с телом, обычно думает: «Э, сабака сука, что это тут болтается?» — и просто игнорирует эту хуйню. Парсеры вроде
body-parserтоже не парсятся. - OPTIONS: Этот вообще как справочное бюро. Он только выясняет, что можно делать с ресурсом (всем привет, CORS). Какое нахуй тело? Ему и так норм.
Вот смотри, как это в Express выглядит на практике:
const express = require('express');
const app = express();
app.use(express.json()); // Подключаем body-parser для JSON
// Этот body-parser для GET-запроса просто отдыхает. Он тело парсить не будет.
app.get('/api/users', (req, res) => {
// Тут req.body будет пустым объектом {} или вообще undefined,
// даже если клиент, такой хитрожопый, попытался что-то впихнуть.
console.log(req.body); // Выведет: {}
res.json({ users: [] });
});
// Для GET-запросов данные надо передавать через query-параметры в URL, ёпта!
// Например: GET /api/users?name=John&age=30
Запомни раз и навсегда: если тебе нужно что-то получить или спросить — лепи параметры прямо в URL (в путь или после знака вопроса). Это не просто прихоть, а правильный, RESTful-подход. Плюс такие запросы можно нормально кэшировать, что для производительности — овердохуища пользы. Не усложняй, где не надо.