Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# HTTP методы, где не передаётся тело ответа
Краткий ответ
Тело ответа (response body) не передаётся при:
- 204 No Content — успешно, но нет данных
- 304 Not Modified — клиент может использовать кэш
- 1xx информационные — продолжение, ожидание
- Запросы HEAD — как GET, но без тела
- Запросы OPTIONS — информация о методах, может быть без тела
HTTP Статус коды без тела
1xx — Информационные
100 Continue — Продолжить отправку
101 Switching — Переключение протокола
102 Processing — Обработка (WebDAV)
103 Early Hints — Ранние подсказки
Характеристики:
- Промежуточные ответы
- Не содержат тело
- Сервер ждёт ещё данных от клиента
Пример:
POST /upload HTTP/1.1
Host: example.com
Expect: 100-continue
Content-Length: 1000000
← 100 Continue (без тела)
← Тело данных 1000000 байт
204 — No Content
HTTP/1.1 204 No Content
Content-Type: application/json
← БЕЗ тела ответа!
Когда используется:
- DELETE успешно
- PUT успешно без возврата данных
- POST успешно без возврата данных
Пример:
// DELETE запрос
DELETE /users/123 HTTP/1.1
← 204 No Content (без тела)
304 — Not Modified
GET /file.js HTTP/1.1
If-None-Match: "abc123"
← 304 Not Modified (без тела)
← Клиент использует версию из кэша
Характеристики:
- Условный запрос (If-Modified-Since, If-None-Match)
- Тело не отправляется
- Клиент может использовать кэшированный ответ
205 — Reset Content
HTTP/1.1 205 Reset Content
← БЕЗ тела
← Клиент должен сбросить форму
HTTP методы без тела ответа
HEAD метод
HEAD /index.html HTTP/1.1
← Точно такой же ответ как GET
← Но БЕЗ тела
← Только заголовки
Использование:
- Проверка доступности ресурса
- Получение metadata без самого контента
- Проверка размера файла
Пример в Java:
// Spring Controller
@GetMapping("/api/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
// HEAD запрос автоматически вернёт ту же схему без тела
HEAD /api/users/123
← HTTP/1.1 200 OK
← Content-Type: application/json
← Content-Length: 245
← (БЕЗ тела)
OPTIONS метод
OPTIONS /api/users HTTP/1.1
← HTTP/1.1 200 OK
← Allow: GET, POST, OPTIONS
← (может быть без тела)
Использование:
- CORS preflight запрос
- Узнать поддерживаемые методы
- Проверка доступных операций
Пример CORS preflight:
OPTIONS /api/data HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: POST
← HTTP/1.1 204 No Content
← Access-Control-Allow-Origin: https://example.com
← Access-Control-Allow-Methods: GET, POST, PUT, DELETE
← (БЕЗ тела, даже статус 204)
Полная таблица
| Статус | Тело | Описание |
|---|---|---|
| 1xx | ❌ | Информационные (продолжение) |
| 100 | ❌ | Continue |
| 101 | ❌ | Switching Protocols |
| 2xx | - | Успех |
| 200 | ✓ | OK (обычно есть) |
| 201 | ✓ | Created |
| 204 | ❌ | No Content |
| 205 | ❌ | Reset Content |
| 3xx | - | Редирект |
| 301 | ✓ | Moved Permanently (может быть) |
| 304 | ❌ | Not Modified |
| 4xx | ✓ | Ошибка клиента |
| 400 | ✓ | Bad Request |
| 404 | ✓ | Not Found |
| 5xx | ✓ | Ошибка сервера |
| 500 | ✓ | Internal Server Error |
Правило в HTTP/1.1
Если статус код в наборе {1xx, 204, 304}:
→ Не отправлять тело ответа
→ Но можно отправлять заголовки
RFC 7232:
Ответ 304 должен содержать только заголовки (нет тела)
RFC 7231:
Ответ 204 должен содержать только заголовки (нет тела)
Примеры в коде
Пример 1: Spring без тела
@RestController
@RequestMapping("/api")
public class UserController {
// 204 No Content
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteById(id);
return ResponseEntity.noContent().build();
// Вернёт 204 без тела
}
// 200 OK с телом
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
// Вернёт 200 с JSON телом
}
// 205 Reset Content
@PostMapping("/reset")
public ResponseEntity<Void> reset() {
// Очистить состояние
return ResponseEntity
.status(HttpStatus.RESET_CONTENT)
.build();
// Вернёт 205 без тела
}
}
Пример 2: HTTP запросы
# DELETE → 204 No Content
DELETE /api/users/123 HTTP/1.1
Host: api.example.com
HTTP/1.1 204 No Content
Date: Wed, 22 Mar 2024 10:00:00 GMT
(НЕТ тела)
---
# HEAD → 200 OK без тела
HEAD /api/users/123 HTTP/1.1
Host: api.example.com
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 180
Date: Wed, 22 Mar 2024 10:00:00 GMT
(НЕТ тела)
---
# GET с кэшированием → 304 Not Modified
GET /static/style.css HTTP/1.1
If-None-Match: "33a64df551"
HTTP/1.1 304 Not Modified
ETag: "33a64df551"
Date: Wed, 22 Mar 2024 10:00:00 GMT
(НЕТ тела, клиент использует кэш)
Пример 3: CORS Preflight
@RestController
@CrossOrigin(origins = "https://example.com")
@RequestMapping("/api")
public class DataController {
@PostMapping("/data")
public ResponseEntity<Data> postData(@RequestBody Data data) {
// Обработка
return ResponseEntity.ok(data);
}
}
// Автоматически обрабатывает OPTIONS запрос:
// OPTIONS /api/data
// → 204 No Content (или 200 OK без тела)
// → Заголовки с CORS информацией
Практическое применение
Когда использовать 204 No Content
// Хорошо: операция выполнена, нечего возвращать
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteById(id);
return ResponseEntity.noContent().build();
}
// Хорошо: обновление выполнено
@PutMapping("/settings")
public ResponseEntity<Void> updateSettings(@RequestBody Settings settings) {
settingsService.update(settings);
return ResponseEntity.noContent().build();
}
// Плохо: есть данные для возврата
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
User created = userService.create(user);
// Вернуть 201 Created с созданным user'ом
return ResponseEntity.status(201).body(created);
}
Когда использовать HEAD
// Клиентская сторона
// Проверить размер файла перед скачиванием
fetch('/large-file.zip', { method: 'HEAD' })
.then(r => {
const size = r.headers.get('content-length');
console.log('File size: ' + size + ' bytes');
// Без скачивания самого файла
});
Ответ на собеседовании
Вопрос: Где не передаётся тело ответа?
Ответ:
Тело ответа не передаётся при следующих статус кодах:
- 1xx (информационные) — 100 Continue, 101 Switching Protocols
- 204 No Content — успешно, но нет данных для возврата
- 205 Reset Content — сбросить состояние форм
- 304 Not Modified — условный запрос, клиент использует кэш
Также тело не передаётся при:
- HEAD методе — точно как GET, но без тела
- OPTIONS методе — может быть без тела
Этом стандартизировано в HTTP спецификации и важно для оптимизации, кэширования и экономии трафика.
Важно помнить, что заголовки всё равно отправляются, только тело опускается.
Заключение
- 1xx, 204, 205, 304 статусы не содержат тело
- HEAD метод не возвращает тело (даже если есть заголовки)
- Заголовки отправляются, только тело опускается
- 204 используется, когда операция успешна, но нет данных
- 304 используется при условных запросах и кэшировании