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

Какие знаешь статус-коды?

1.3 Junior🔥 231 комментариев
#REST API и микросервисы

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

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

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

Статус-коды HTTP и их применение в Java приложениях

Статус-коды HTTP — это трёхзначные коды, которые сервер возвращает в ответ на запрос клиента. Они указывают на результат обработки запроса и делятся на 5 категорий.

Категории статус-кодов

1xx (Информационные) — промежуточные ответы:

  • 100 Continue — клиент может продолжить отправку тела запроса
  • 101 Switching Protocols — сервер согласен переключиться на другой протокол

2xx (Успешные) — запрос успешно обработан:

  • 200 OK — стандартный успешный ответ
  • 201 Created — ресурс успешно создан (POST, PUT)
  • 202 Accepted — запрос принят, но обработка ещё не завершена
  • 204 No Content — успешно, но нет контента в ответе (часто DELETE)
  • 206 Partial Content — возвращена часть контента (для range запросов)

3xx (Перенаправление) — требуется дополнительное действие:

  • 300 Multiple Choices — несколько вариантов ответа
  • 301 Moved Permanently — постоянный редирект
  • 302 Found — временный редирект (самый частый)
  • 304 Not Modified — кэш актуален, контент не изменился
  • 307 Temporary Redirect — как 302, но гарантирует сохранение метода
  • 308 Permanent Redirect — как 301, но сохраняет метод запроса

4xx (Ошибки клиента) — проблема с запросом:

  • 400 Bad Request — некорректный синтаксис запроса
  • 401 Unauthorized — требуется аутентификация
  • 403 Forbidden — доступ запрещён (аутентифицирован, но не авторизован)
  • 404 Not Found — ресурс не найден
  • 405 Method Not Allowed — метод не поддерживается (GET вместо POST)
  • 409 Conflict — конфликт (например, версия ресурса изменилась)
  • 422 Unprocessable Entity — данные валидны синтаксически, но семантически неверны
  • 429 Too Many Requests — слишком много запросов (rate limiting)

5xx (Ошибки сервера) — сервер не может обработать запрос:

  • 500 Internal Server Error — неожиданная ошибка на сервере
  • 502 Bad Gateway — некорректный ответ от upstream сервера
  • 503 Service Unavailable — сервис временно недоступен
  • 504 Gateway Timeout — timeout при ожидании ответа от upstream

Примеры использования в Spring Boot

// Возврат разных статус-кодов
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    // 200 OK (по умолчанию)
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
    
    // 201 Created
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody UserRequest request) {
        User user = userService.create(request);
        return ResponseEntity.status(HttpStatus.CREATED)
            .location(URI.create("/api/users/" + user.getId()))
            .body(user);
    }
    
    // 204 No Content
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.delete(id);
        return ResponseEntity.noContent().build();
    }
    
    // 404 Not Found
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException e) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
            .body(new ErrorResponse("User not found"));
    }
    
    // 400 Bad Request
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidation(
            MethodArgumentNotValidException e) {
        return ResponseEntity.badRequest()
            .body(new ErrorResponse("Validation failed"));
    }
    
    // 409 Conflict
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(
            @PathVariable Long id,
            @RequestBody UserRequest request,
            @RequestHeader("If-Match") String version) {
        User user = userService.update(id, request, version);
        return ResponseEntity.ok(user);
    }
}

HTTP коды в клиентских запросах (RestTemplate, WebClient)

// Spring RestTemplate
RestTemplate template = new RestTemplate();
try {
    ResponseEntity<User> response = template.getForEntity(
        "http://api.example.com/users/1", User.class);
    
    if (response.getStatusCode() == HttpStatus.OK) {
        User user = response.getBody();
    }
} catch (HttpClientErrorException e) {
    if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
        // Handle 404
    }
}

// Spring WebClient (рекомендуется)
WebClient client = WebClient.create();
client.get()
    .uri("http://api.example.com/users/{id}", userId)
    .retrieve()
    .onStatus(
        status -> status.is4xxClientError(),
        response -> response.createException()
            .flatMap(ex -> Mono.error(
                new ApiClientException("Client error: " + ex)))
    )
    .bodyToMono(User.class)
    .subscribe(
        user -> System.out.println("User: " + user),
        error -> System.err.println("Error: " + error)
    );

Лучшие практики

  • Выбирай правильный код — не возвращай 500 за валидационные ошибки (400)
  • 201 для создания — используй Created при POST, который создаёт новый ресурс
  • 204 для удаления — ничего не возвращай, только статус
  • Информативные ошибки — включай детали в body ошибки (4xx, 5xx)
  • Идемпотентность — PUT/DELETE должны быть идемпотентны (повторение = тот же результат)
  • Кэширование — используй 304 Not Modified для кэшированных ответов
  • Rate limiting — возвращай 429 с заголовком Retry-After

Правильное использование статус-кодов делает API предсказуемым и облегчает отладку.

Какие знаешь статус-коды? | PrepBro