DEV Community

Cover image for Путеводитель по HTTP-кодам в Java: Как понять, что сервер от тебя хочет?
Olga Lugacheva
Olga Lugacheva

Posted on

Путеводитель по HTTP-кодам в Java: Как понять, что сервер от тебя хочет?

В мире HTTP-кодов каждый ответ сервера — как сообщение с другого конца вселенной. Ты отправил запрос, и вот, на экране появляется этот загадочный код. Что он значит? Как его понимать? Давай разберемся, как ловить сигналы от сервера и не попасть в ловушку.

Почему они вообще нам отвечают кодами?

Сервер — как старый добрый профессор. Он не будет каждый раз писать длинные письма. В ответах он использует HTTP-коды, или трехзначные сигналы, которые помогают тебе (и другим разработчикам) понять, что происходит. Они делятся на пять категорий, как уважаемые возрастные группы, от мудрых информационных (1xx) до капризных ошибочных (4xx и 5xx).

Вот наши основные герои:

  • 1xx: Сервер, задумчиво попивая кофе, говорит: "Да, да, я работаю, подожди..."
  • 2xx: Все круто, запрос выполнен, сервер доволен.
  • 3xx: "Ой, слушай, ты не туда пошел. Давай перенаправлю тебя!"
  • 4xx: Сервер возмущен: "Ты неправильно меня понял, чего ты хочешь-то?"
  • 5xx: Ох, кажется, сервер уронил что-то важное и сам запутался.

Как понять, что сервер счастлив? Коды 2xx
Сервер, как и любой интроверт, просто счастлив, если ты правильно все сделал. Вот его сигналы одобрения:

  • 200 OK — "Все прошло как по маслу!" Запрос обработан, можешь радоваться.
  • 201 Created — "Новое что-то создалось, лови!" Как бонус, это может быть новая запись в базе.
  • 204 No Content — "Все готово, но показать мне нечего." Например, ты удалил что-то, и показывать там уже нечего.

200ok

Пример на Java: Как получить это магическое "OK"?

HttpURLConnection connection = (HttpURLConnection) new URL("https://easy.java.com/data").openConnection();
connection.setRequestMethod("GET");

if (connection.getResponseCode() == 200) {
    System.out.println("Сервер сказал ОК! Тянем данные...");
}

Enter fullscreen mode Exit fullscreen mode

А если сервер не доволен? Коды 4xx

Здесь уже могут быть проблемы, как если ты случайно ** открыл не ту дверь**.

403nono

  • 400 Bad Request — "Ты что-то явно намудрил в запросе."
  • 401 Unauthorized — "Ты кто такой? Я тебя не знаю." Похоже, нужен пароль!
  • 402 Payment Required. Этот код был зарезервирован для платного доступа к определённым ресурсам, но почти не используется. Если бы он использовался, то звучал бы как: «Сначала оплатите счёт, а потом получите доступ!» Возможно, сервер бы стоял у входа с кассовым аппаратом.
  • 403 Forbidden — "Эй, даже с паролем ты сюда не пройдешь." Видимо, не тот доступ.
  • 404 Not Found — "Оно где-то было… но куда-то делось." Этот код просто классика.
  • 409 Conflict — "Ты и еще кто-то хотят одно и то же. Кто же победит?"
  • Пример: обработка ошибок, когда сервер ворчит
int responseCode = connection.getResponseCode();

if (responseCode == 404) {
    System.out.println("Сервер говорит, что ничего не нашел.");
} else if (responseCode == 401) {
    System.out.println("Ой, кажется, сюда нужен пароль.");
}

Enter fullscreen mode Exit fullscreen mode

Когда сервер устроил рок-концерт: коды 5xx

И тут — сервер не выдерживает. Он хотел работать, но где-то что-то явно пошло не так.

  • 500 Internal Server Error — Представим, что сервер — рок-звезда, которая внезапно потеряла ноту в разгар концерта и вынуждена признать поражение: «Что-то пошло не так!». Это стандартная реакция сервера, когда он сам не понимает, что случилось. В коде это часто выглядит как «Общая ошибка, что-то не сработало», а в логах можно увидеть что-то вроде «Unknown error occurred».
  • 501 Not Implemented - Этот код означает, что сервер понятия не имеет, как обрабатывать текущий запрос. Можно представить его как айтишника, которого просят исправить кран на кухне. Он стоит с ключом, смотрит на кран и произносит: «Это не моя специальность!». Чаще всего это возникает, если клиент делает запрос, который сервер не поддерживает.
  • 502 Bad Gateway Здесь сервер-посредник (гейтвей или прокси) пытается связаться с другим сервером, но тот ему ответил чем-то непонятным или не ответил вообще
  • 503 Service Unavailable — "Ой, я сейчас не могу, дай пять минут." Или сервис лег, или сервер переполнен. Если бы сервер мог брать выходные, это был бы его любимый код.
  • 504 Gateway Timeout Это код означает, что сервер не дождался ответа от другого сервера, который должен был ответить на запрос. Представьте сервер в ожидании ответа, который так и не пришёл. В итоге сервер говорит клиенту: «Ну, я ждал, ждал, но ничего не дождался».

502bad

Используем RestTemplate: как общаться с сервером на Spring

Когда ты работаешь со Spring, у тебя есть RestTemplate и WebClient для запросов. Они позволяют тебе ловить ответы сервера, как настоящий рыболов.

RestTemplate: ловим ответ сервера

RestTemplate restTemplate = new RestTemplate();
String url = "https://easy.java.com/data";

ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

if (response.getStatusCode() == HttpStatus.OK) {
    System.out.println("Ответ от сервера: " + response.getBody());
} else if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
    System.out.println("Сервер сказал, что ничего не нашел.");
} else {
    System.out.println("Что-то странное: " + response.getStatusCode());
}
Enter fullscreen mode Exit fullscreen mode

WebClient для любителей асинхронности

WebClient — это инструмент для тех, кто не боится работать в стиле "жду, но не сразу". Ты как бы говоришь: "Сервер, сделай, что сможешь, а я пока подожду".

WebClient webClient = WebClient.create("https://easy.java.com");

Mono<String> responseMono = webClient.get()
        .uri("/data")
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, clientResponse -> {
            System.out.println("Ой, ошибка клиента!");
            return Mono.empty();
        })
        .onStatus(HttpStatus::is5xxServerError, clientResponse -> {
            System.out.println("Проблема на сервере...");
            return Mono.empty();
        })
        .bodyToMono(String.class);

responseMono.subscribe(response -> System.out.println("Ответ от сервера: " + response));

Enter fullscreen mode Exit fullscreen mode

Советы

Проверь таймауты — иногда сервер зависает, а тебе бы успеть на обед. Устанавливай время ожидания.
Не забывай про логирование — каждый код важен! Логируй ответы, и ты всегда сможешь понять, что пошло не так.
Работай с 4xx и 5xx — на ошибках учатся. Чем лучше ты обрабатываешь такие ответы, тем более устойчивым будет твое приложение.

Заключение

Сервер — существо капризное, и каждый раз, получая от него код, ты как будто разгадываешь ребус. Но, зная основные коды и их смысл, ты сможешь быстро понять, что же от тебя требуется!

Помни: HTTP-коды — это язык общения между твоим Java-кодом и сервером. Умей читать его, и сервер будет всегда доволен.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay