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-кодом и сервером. Умей читать его, и сервер будет всегда доволен.

Top comments (0)