HttpURLConnection.getResponseCode: примеры (JAVA)
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или новыйHttpClientJava; синтаксис лаконичнее, совместимость с 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()при коде ошибки: при кодах >=400getInputStream()выбрасывает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-запрос для проверки доступности ресурса без загрузки тела:
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 и повторным запросом:
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:
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:
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:
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
- джава HttpURLConnection.getResponseCode - аргументы и возвращаемое значение
- Функция java HttpURLConnection.getResponseCode - описание
- HttpURLConnection.getResponseCode - примеры
- HttpURLConnection.getResponseCode - похожие методы на java
- HttpURLConnection.getResponseCode на javascript, c#, python, php
- HttpURLConnection.getResponseCode изменения java
- Примеры HttpURLConnection.getResponseCode на джава