HttpURLConnection.getResponseCode: примеры (JAVA)

Метод getResponseCode в HttpURLConnection
Раздел: Работа с HTTP (HTTP Client, URLConnection)
HttpURLConnection.getResponseCode: int

Общее описание и поведение метода

Метод HttpURLConnection.getResponseCode() из пакета java.net возвращает числовой код HTTP-ответа от удалённого сервера. Метод не принимает аргументов и имеет сигнатуру public int getResponseCode() throws IOException. В нормальном сценарии он инициирует соединение (если оно ещё не установлено), читает заголовки ответа и возвращает код статуса HTTP, например 200, 404, 500 и т.д. В случае отсутствия ответа возвращаемое значение может быть -1.

Поведенческие особенности:

  • Метод может вызвать подключение и чтение заголовков автоматически; предварительный вызов connect() не обязателен.
  • При ошибочных кодах (обычно >=400) поток с данными доступен через getErrorStream(), а не через getInputStream(). Вызов getInputStream() для кода ошибки часто вызывает IOException.
  • Если для соединения включено автоматическое следование редиректам (setInstanceFollowRedirects(true) или глобальная настройка), результат может быть конечным кодом после серии перенаправлений. При отключённом следовании метод вернёт код из первого ответа, например 301 или 302, и можно прочитать заголовок Location.
  • Метод возвращает -1, когда сервер не ответил корректным HTTP-статусом или если заголовки ещё не были разобраны.

Исключения и возвращаемые значения:

  • Возвращаемый тип: int - числовой HTTP-код или -1 при отсутствии кода.
  • Исключение: IOException при сетевых ошибках, проблемах с вводом-выводом или при попытке получить содержимое при ошибочном коде через getInputStream().
  • Дополнительные исключения могут возникать при SSL-проблемах (SSLHandshakeException) или при неверной конфигурации прокси.

Простые варианты использования

Несколько компактных примеров для типичных ситуаций. Примеры используют класс HttpURLConnection. Код выводит полученный код ответа.

GET с успешным ответом (200):

import java.net.*;
import java.io.*;

URL url = new URL("https://httpbin.org/status/200");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
System.out.println(code);
conn.disconnect();
200

Запрос к несуществующей странице (404):

URL url = new URL("https://httpbin.org/status/404");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
System.out.println(code);
InputStream err = conn.getErrorStream();
System.out.println(err != null ? "error stream available" : "no error stream");
conn.disconnect();
404
error stream available

Редирект при отключённом автоматическом следовании:

URL url = new URL("https://httpbin.org/redirect-to?url=/status/200&status_code=302");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(false);
int code = conn.getResponseCode();
String loc = conn.getHeaderField("Location");
System.out.println(code + ", Location: " + loc);
conn.disconnect();
302, Location: /status/200

Альтернативные Java-решения

В экосистеме Java есть несколько вариантов работы с HTTP, каждый с особенностями:

  • java.net.http.HttpClient (Java 11+) - современный API, поддержка асинхронности, HTTP/2, более удобная работа с кодами ответов через HttpResponse.statusCode(). Предпочтение в новых проектах.
  • Apache HttpClient - богатая функциональность, гибкая конфигурация пула соединений, обработка аутентификации и редиректов. Подходит для сложных требований и тонкой настройки.
  • OkHttp - лёгкий и быстрый клиент, удобен для мобильных и современных приложений, простой API и хорошие дефолтные настройки.

Выбор зависит от требований: для простых задач и современного стека предпочтительнее HttpClient; при необходимости тонкой настройки и поддержки старых версий Java - Apache HttpClient или OkHttp.

Альтернативы в других языках и отличия

Краткие примеры получения HTTP-кода в разных языках и комментарии по отличиям от Java:

  • PHP (curl): код берётся из curl_getinfo(). Поведение: явный вызов библиотеки cURL, удобно для системных скриптов.
    $ch = curl_init('https://httpbin.org/status/200');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo $code;curl_close($ch);
    200
  • JavaScript (fetch): статус доступен в response.status. Асинхронность по умолчанию.
    fetch('https://httpbin.org/status/404')
      .then(r => console.log(r.status));
    404
  • Python (requests): удобный синхронный API, код в response.status_code.
    import requests
    r = requests.get('https://httpbin.org/status/500')
    print(r.status_code)
    500
  • C# (HttpClient): статус в response.StatusCode (enum/число). Поддержка async/await.
    using var client = new HttpClient();
    var r = await client.GetAsync("https://httpbin.org/status/200");
    Console.WriteLine((int)r.StatusCode);
    200
  • Go (net/http): resp.StatusCode. Простая модель конкурентности и потокобезопасность по умолчанию.
    resp, _ := http.Get("https://httpbin.org/status/201")
    fmt.Println(resp.StatusCode)
    201
  • Kotlin: может использовать тот же HttpURLConnection или новый HttpClient Java; синтаксис лаконичнее, совместимость с JVM.
  • Lua (LuaSocket): http.request возвращает тело и код.
    local http = require('socket.http')
    local body, code = http.request('http://httpbin.org/status/204')
    print(code)
    204
  • SQL: большинство СУБД не предназначены для HTTP-запросов напрямую; в Oracle есть пакет UTL_HTTP, в PostgreSQL возможны расширения (например, pgsql-http) или вызовы внешних функций. Поведение и возможности зависят от СУБД и настроек безопасности.

Отличие от Java: в многих языках API для HTTP-доступа проектировался с прицелом на асинхронность или на простоту; Java имеет несколько реализаций и совместимость с JVM обеспечивает широкий выбор.

Типичные ошибки и причины

Частые проблемы при использовании getResponseCode() и краткие объяснения:

  • Ожидание содержимого через getInputStream() при коде ошибки: при кодах >=400 getInputStream() выбрасывает IOException. Надо использовать getErrorStream() для чтения тела ошибок.
  • Получение -1 вместо кода: возможно, сервер не прислал корректный HTTP-статус или соединение ещё не завершило обмен заголовками.
  • Блокировка на сетевых операциях: отсутствие таймаутов может привести к долгой блокировке. Рекомендуется настраивать setConnectTimeout и setReadTimeout.
  • SSL-ошибки при HTTPS: при проблемах с сертификатом возникает SSLHandshakeException. Требуется корректная конфигурация доверенных сертификатов или кастомный SSLSocketFactory.
  • Путаница с редиректами: ожидание клиента, что код будет конечным 200, тогда как включено следование редиректам или наоборот. Для контроля редиректов используется setInstanceFollowRedirects.
  • Незакрытые соединения: забывание disconnect() или закрытия потоков приводит к утечкам ресурсов и исчерпанию сокетов.

Пример ошибки чтения при коде 404:

HttpURLConnection conn = (HttpURLConnection) new URL("https://httpbin.org/status/404").openConnection();
InputStream is = conn.getInputStream(); // IOException при 404
int code = conn.getResponseCode();
System.out.println(code);
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 404 for URL: ...

Изменения и эволюция подхода к HTTP в Java

Сам метод getResponseCode() остаётся частью HttpURLConnection и не был существенно изменён в последних релизах JDK. Основное изменение экосистемы связано с появлением более современного API:

  • Java 11 представила java.net.http.HttpClient с поддержкой HTTP/2, асинхронных вызовов и удобным доступом к статусу через HttpResponse.statusCode(). Для новых проектов этот клиент часто предпочтительнее.
  • Исторические отличия в поведении редиректов и в обращении с методом POST могли влиять в старых реализациях JVM. В новых реализациях поведение стало более предсказуемым, но для критичных сценариев рекомендуется явно управлять редиректами.

Расширенные и редкие сценарии применения

Несколько детальных примеров, показывающих особенности работы и обработку нестандартных ситуаций.

HEAD-запрос для проверки доступности ресурса без загрузки тела:

Пример java
URL url = new URL("https://httpbin.org/status/204");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
int code = conn.getResponseCode();
System.out.println(code);
conn.disconnect();
204

Обработка редиректов вручную с извлечением Location и повторным запросом:

Пример java
URL url = new URL("https://httpbin.org/redirect-to?url=/status/200&status_code=302");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(false);
int code = conn.getResponseCode();
if (code == 301 || code == 302 || code == 307 || code == 308) {
  String loc = conn.getHeaderField("Location");
  URL next = new URL(url, loc);
  HttpURLConnection conn2 = (HttpURLConnection) next.openConnection();
  conn2.setRequestMethod("GET");
  System.out.println(conn2.getResponseCode());
  conn2.disconnect();
}
conn.disconnect();
302
200

Запись тела POST и обработка кода ошибки через getErrorStream:

Пример java
URL url = new URL("https://httpbin.org/status/400");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
byte[] out = "data=1".getBytes();
conn.getOutputStream().write(out);
int code = conn.getResponseCode();
System.out.println(code);
try (InputStream err = conn.getErrorStream()) {
  if (err != null) System.out.println(new String(err.readAllBytes()));
}
conn.disconnect();
400
{"message":"Bad Request"} (пример содержимого error stream)

Использование прокси и проверка статуса через Proxy:

Пример java
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080));
URL url = new URL("http://httpbin.org/status/200");
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
System.out.println(conn.getResponseCode());
conn.disconnect();
200

Параллельные проверки статусов нескольких URL с использованием ExecutorService:

Пример java
List urls = List.of("https://httpbin.org/status/200", "https://httpbin.org/status/404");
ExecutorService ex = Executors.newFixedThreadPool(2);
for (String u : urls) {
  ex.submit(() -> {
    HttpURLConnection c = (HttpURLConnection) new URL(u).openConnection();
    System.out.println(u + " -> " + c.getResponseCode());
    c.disconnect();
  });
}
ex.shutdown();
https://httpbin.org/status/200 -> 200
https://httpbin.org/status/404 -> 404

джава HttpURLConnection.getResponseCode function comments

En
HttpURLConnection.getResponseCode Gets the status code from an HTTP response message