← Назад к вопросам

Где не передается тело ответа?

2.0 Middle🔥 171 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# HTTP методы, где не передаётся тело ответа

Краткий ответ

Тело ответа (response body) не передаётся при:

  1. 204 No Content — успешно, но нет данных
  2. 304 Not Modified — клиент может использовать кэш
  3. 1xx информационные — продолжение, ожидание
  4. Запросы HEAD — как GET, но без тела
  5. Запросы 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.1204 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Информационные (продолжение)
100Continue
101Switching Protocols
2xx-Успех
200OK (обычно есть)
201Created
204No Content
205Reset Content
3xx-Редирект
301Moved Permanently (может быть)
304Not Modified
4xxОшибка клиента
400Bad Request
404Not Found
5xxОшибка сервера
500Internal 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');
        // Без скачивания самого файла
    });

Ответ на собеседовании

Вопрос: Где не передаётся тело ответа?

Ответ:

Тело ответа не передаётся при следующих статус кодах:

  1. 1xx (информационные) — 100 Continue, 101 Switching Protocols
  2. 204 No Content — успешно, но нет данных для возврата
  3. 205 Reset Content — сбросить состояние форм
  4. 304 Not Modified — условный запрос, клиент использует кэш

Также тело не передаётся при:

  • HEAD методе — точно как GET, но без тела
  • OPTIONS методе — может быть без тела

Этом стандартизировано в HTTP спецификации и важно для оптимизации, кэширования и экономии трафика.

Важно помнить, что заголовки всё равно отправляются, только тело опускается.

Заключение

  • 1xx, 204, 205, 304 статусы не содержат тело
  • HEAD метод не возвращает тело (даже если есть заголовки)
  • Заголовки отправляются, только тело опускается
  • 204 используется, когда операция успешна, но нет данных
  • 304 используется при условных запросах и кэшировании