Проверка наличия тела HTTP-запроса: формирование на клиенте и валидация на сервере

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

В работе с веб‑сервисами часто возникает необходимость убедиться, что клиент действительно передал тело запроса (request body). Ниже описаны способы формирования такого запроса и проверки его наличия на стороне сервера ЦООП (центра обработки операций). Всё изложено на русском языке и снабжено примерами кода.


Теория: когда тело запроса может присутствовать

  • POST, PUT, PATCH, DELETE – по спецификации HTTP эти методы могут передавать данные в теле сообщения.
  • GET и HEAD – спецификация допускает наличие тела, но большинство серверов и клиентов его игнорируют. Поэтому на практике тело в GET‑запросе не рекомендуется использовать.
  • Тело запроса может быть в формате application/json, application/x-www-form-urlencoded, multipart/form-data или любом другом, согласованном между клиентом и сервером.

Если вам нужно просто убедиться, что тело пришло, достаточно проверить наличие данных в потоке ввода запроса на сервере.

Как сформировать запрос с телом

Через curl (командная строка)

curl -X POST https://цoоп.example.com/api/check 
 -H "Content-Type: application/json" 

 -d '{"user_id":123,"action":"ping"}'

Опция -d (или --data) формирует тело запроса. Заголовок Content-Type сообщает серверу, как интерпретировать переданные данные.

Через Postman или аналогичный клиент

  1. Выберите метод POST (или PUT/PATCH).
  2. Вкладка Body → raw → выберите JSON (или нужный формат).
  3. Введите данные, например:
    {"test":true}
  4. Нажмите Send.

Через JavaScript в браузере (fetch)

fetch('https://цoоп.example.com/api/check', {
 method: 'POST',
 headers: {
 'Content-Type': 'application/json'
 },
 body: JSON.stringify({ token: 'abc123' })
})
.then(response => response.json)
.then(data => console.log(data))
.catch(err => console.error(err));

Обратите внимание: браузер не позволит отправить тело в GET‑запросе через fetch без явного указания method: 'GET' и body – большинство движков просто игнорируют тело.

Как посмотреть тело запроса на стороне сервера

Ниже приведены примеры для самых популярных стеков. Все они показывают, как получить «сырое» тело запроса и проверить, пусто ли оно.

Node.js (Express)

const express = require('express');
const app = express;

// Для JSON-тела
app.use(express.json);
app.post('/api/check', (req, res) => {
 if (Object.keys(req.body).length === 0) {
 return res.status(400).send({ error: 'Тело запроса отсутствует' });
 }
 res.send({ received: req.body });
});

app.listen(3000);

Если клиент отправил запрос без заголовка Content-Type: application/json или с пустым телом, req.body будет пустым объектом.

Python (Flask)

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/check', methods=['POST'])
def check:
 data = request.get_json(silent=True) # вернёт None, если тело не JSON
 if data is None:
 return jsonify({'error': 'Тело запроса отсутствует или не JSON'}), 400
 return jsonify({'received': data})

if __name__ == '__main__':
 app.run(port=5000)

PHP (чистый)

<?php
$input = file_get_contents('php://input');
$data = json_decode($input, true);

if (json_last_error !== JSON_ERROR_NONE || $data === null) {
 http_response_code(400);
 echo json_encode(['error' => 'Тело запроса отсутствует или некорректно']);
 exit;
}

echo json_encode(['received' => $data]);
?>

Java (Spring Boot)

@RestController
@RequestMapping("/api")
public class CheckController {

 @PostMapping("/check")
 public ResponseEntity<Map<String, Object>> check(@RequestBody Map<String, Object> payload) {
 if (payload == null || payload.isEmpty) {
 return ResponseEntity.badRequest
 .body(Map.of("error", "Тело запроса отсутствует"));
 }
 return ResponseEntity.ok(Map.of("received", payload));
 }
}

Особенности GET‑запросов с телом

Согласно RFC 7231, спецификация HTTP не запрещает наличие тела в GET‑запросе, но:

  • Большинство веб‑серверов (nginx, Apache, IIS) не читают тело GET‑запроса и передают приложению пустой поток.
  • Клиенты (браузеры, curl, Postman) по умолчанию не добавляют тело к GET, если явно не указать его (что считается плохой практикой).
  • Если вам всё‑же нужно передать данные в GET, используйте параметры строки запроса (?key=value&foo=bar) – это стандартный и поддерживаемый способ.

Поэтому, если вы хотите гарантированно передать данные, выбирайте POST/PUT/PATCH.

Как проверить тело запроса в браузере (DevTools)

  1. Откройте панель разработчика (F12 или Ctrl+Shift+I).
  2. Перейдите на вкладку Network (Сеть).
  3. Выполните нужный запрос (например, отправьте форму или выполните fetch‑запрос).
  4. В списке запросов найдите свою запись и кликните по ней.
  5. На правой панели выберите вкладку Payload (или Request Body). Там будет показано тело, если оно было отправлено.

Если вкладка пуста – значит, либо тело не было отправлено, либо запрос был типа GET и браузер не показал его (по причине, описанной выше).

  • Для надёжной передачи данных используйте методы POST, PUT, PATCH с явным указанием Content-Type.
  • На стороне сервера проверяйте тело через стандартные средства фреймворка (req.body, request.get_json, file_get_contents('php://input') и т.п.).
  • Если тело пустое или отсутствует – возвращайте клиенту ошибку 400 (Bad Request) с понятным сообщением.
  • Избегайте передачи тела в GET‑запросах; используйте query‑параметры вместо этого.
  • Для отладки воспользуйтесь сетевой панелью браузера, curl с ключом -v или инструментами вроде Postman/Insomnia.

Следуя этим рекомендациям, вы сможете уверенно формировать запросы к ЦООП и быстро определять, поступило ли тело запроса или нет.