Комментарии (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 предсказуемым и облегчает отладку.