HttpClient.newHttpClient: примеры (JAVA)
HttpClient.newHttpClient: HttpClientОбщее описание HttpClient.newHttpClient
Метод HttpClient.newHttpClient() в Java представляет собой статический фабричный метод из пакета java.net.http (введённого в Java 11). Он возвращает экземпляр HttpClient с конфигурацией по умолчанию. Метод не принимает аргументов и не генерирует проверяемых исключений при создании клиента.
Назначение метода - быстро получить готовый к использованию объект HttpClient для синхронных или асинхронных HTTP-запросов без явной настройки. Для детальной настройки доступен HttpClient.newBuilder(), который предоставляет fluent API для изменения параметров.
Аргументы и возвращаемое значение
Аргументов у newHttpClient() нет. Возвращаемое значение - объект java.net.http.HttpClient. Важные характеристики возвращаемого экземпляра (поведение по умолчанию):
- version: поддержка HTTP/2 и HTTP/1.1; выбор версии происходит в ходе согласования с сервером (по умолчанию
HttpClient.Version.HTTP_2доступен, но фактическая версия зависит от сервера). - followRedirects: по умолчанию
Redirect.NEVER(автоматическая переадресация не выполняется). - connectTimeout: по умолчанию отсутствует (Optional.empty()).
- proxySelector: системный селектор прокси или
ProxySelector.getDefault(). - authenticator: отсутствует по умолчанию (null), авторизация не настраивается автоматически.
- cookieHandler: отсутствует по умолчанию (null), печенья не сохраняются автоматически.
- sslContext и sslParameters: значения по умолчанию из JVM (стандартный SSLContext), стандартные настройки безопасности.
- executor: по умолчанию null - используется внутренний пул потоков, управляемый реализацией.
Примечание:
Для изменения любых перечисленных свойств следует использовать HttpClient.newBuilder(), после чего вызвать build(). Сам newHttpClient() удобен при типичных сценариях, когда требуется быстрый клиент без кастомных настроек.
Короткие примеры использования
Несколько минимальных примеров с клиентом, созданным через HttpClient.newHttpClient(). В коде показано тело запроса и ожидаемый примерный результат.
Пример 1. Простой синхронный GET
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body().substring(0, 80));
200
{\n "args": {}, "headers": { ... } ...
Пример 2. Асинхронный POST с JSON
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString("{\"name\":\"Alice\"}"))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenAccept(resp -> {
System.out.println(resp.statusCode());
System.out.println(resp.body().substring(0, 60));
});
// ожидание для демонстрации (в реальном приложении использовать chaining)
Thread.sleep(2000);
200
{"args":{}, "data":"{\"name\":\"Alice\"}", ...}
Пример 3. Получение файла в локальную систему (синхронно)
import java.nio.file.Path;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/image/png"))
.GET()
.build();
HttpResponse<Path> resp = client.send(request, HttpResponse.BodyHandlers.ofFile(Path.of("image.png")));
System.out.println(resp.statusCode());
System.out.println("Файл записан: " + resp.body());
200 Файл записан: image.png
Похожие механизмы в Java
В Java присутствуют другие варианты работы с HTTP, каждый имеет свои особенности.
- HttpClient.newBuilder() - предпочтительнее при необходимости конфигурации: установка таймаутов, обработчиков cookies, прокси, авторизации, executor и выбора версии HTTP.
- java.net.URLConnection / HttpURLConnection - устаревший низкоуровневый API, менее удобен и более многословен; пригоден в старых кодовых базах, но для новых проектов обычно выбирается java.net.http или сторонние библиотеки.
- Apache HttpClient (HttpComponents) - предоставляет богатые возможности для управления соединениями, продвинутую конфигурацию, поддержку пулинга соединений и сложной аутентификации; предпочтительнее для проектов с высокими требованиями к производительности и гибкости.
- OkHttp - сторонняя библиотека, популярная в экосистеме Android и серверных приложениях; удобна для HTTP/2, потоковой передачи и кеширования на уровне клиента.
Альтернативы в других языках и отличия
Краткое сопоставление популярных API в других языках и ключевые различия по сравнению с Java HttpClient.newHttpClient().
JavaScript (fetch)
// браузер
fetch('https://httpbin.org/get')
.then(r => r.json())
.then(j => console.log(j));
{args: {}, headers: {...}, url: 'https://httpbin.org/get'}
fetch встроен в браузер, в Node.js часто используется node-fetch или axios; модель промисов и интеграция с Fetch API упрощают асинхронность.
Python (requests и aiohttp)
# requests (синхронно)
import requests
r = requests.get('https://httpbin.org/get')
print(r.status_code)
print(r.json()['url'])
200 https://httpbin.org/get
requests проще по синтаксису, aiohttp предоставляет асинхронную версию. В отличие от Java, Python-библиотеки часто имеют менее строгую типизацию и более компактный синтаксис.
PHP (curl / Guzzle)
// curl (функция)
$ch = curl_init('https://httpbin.org/get');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
curl_close($ch);
echo substr($out,0,80);
{"args":{}, "headers":{...}}
Guzzle предоставляет удобное API аналогичное HttpClient.newBuilder() для конфигурации.
C# (HttpClient)
using System.Net.Http;
var client = new HttpClient();
var resp = await client.GetStringAsync("https://httpbin.org/get");
Console.WriteLine(resp.Substring(0,60));
{"args":{},"headers":{...}}
C# HttpClient по умолчанию также предоставляет асинхронные методы; важно управлять временем жизни экземпляра, чтобы избежать проблем с сокетами.
Go (net/http)
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main(){
resp, _ := http.Get("https://httpbin.org/get")
b,_ := ioutil.ReadAll(resp.Body)
fmt.Println(string(b)[:60])
}
{"args":{},"headers":{...}}
Go предлагает простую синхронную модель, горутины обеспечивают лёгкую параллелизацию.
SQL
В большинстве SQL-сред нет встроенного HTTP-клиента. Некоторые СУБД предоставляют расширения или встроенные функции (например, PostgreSQL с расширением http или вызовы внешних библиотек через расширения). Отличие - отсутствие стандартного portable API, обычно требуется установка модулей или использование внешних языковых расширений.
Lua
-- lua с luasocket
local http = require('socket.http')
local body, code = http.request('https://httpbin.org/get')
print(code)
print(body:sub(1,60))
200
{"args":{},"headers":{...}}
В целом различие с Java: у Java встроенный типобезопасный HttpClient с синхронными и асинхронными возможностями и тесной интеграцией с JDK; в других языках чаще используются внешние библиотеки с собственными семантиками и управлением жизненным циклом.
Типичные ошибки и примеры
Ниже перечислены распространённые проблемы при использовании HttpClient и примеры их проявления.
Ошибка 1. Неверный URI
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://[invalid-uri]"))
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
client.send(request, HttpResponse.BodyHandlers.ofString());
Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in scheme name at index 0: http://[invalid-uri]
Ошибка 2. Прерывание потока при синхронном вызове
try {
client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Interrupted");
}
Interrupted
Ошибка 3. Проблемы с SSL
// при подключении к серверу с некорректным сертификатом
HttpResponse<String> resp = client.send(request, HttpResponse.BodyHandlers.ofString());
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: ...
Ошибка 4. Таймауты и HttpTimeoutException
HttpClient client = HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(1))
.build();
// при медленном соединении
client.send(request, HttpResponse.BodyHandlers.ofString());
java.net.http.HttpTimeoutException: request timed out
Ошибка 5. Превышение лимитов потоков при неправильном управлении Executor
Если задать собственный Executor с ограничением и одновременно запустить большое количество асинхронных задач, возможна задержка выполнения и истощение ресурсов. Для серверных приложений рекомендуется правильно подбирать пул потоков и переиспользовать HttpClient.
Изменения и история
Класс java.net.http.HttpClient и метод newHttpClient() появились в Java 11 как стандартный модуль для работы с HTTP/1.1 и HTTP/2. С тех пор существенных изменений в сигнатуре newHttpClient() не происходило.
- Java 11 - первоначальное включение API (HttpClient, HttpRequest, HttpResponse и связанные классы).
- В последующих релизах фиксировались улучшения реализации, исправления производительности и исправления в поддержке HTTP/2 и TLS, но фабричный метод оставался совместимым.
- Начиная с Java 17 и далее, внимание уделялось стабильности и безопасности; для специфичных настроек по-прежнему рекомендуется
HttpClient.newBuilder().
Расширенные и редкие сценарии применения
Несколько продвинутых примеров, использующих полученный клиент. Пояснения к каждому примеру предоставлены кратко.
Advanced 1. Асинхронные запросы с объединением результатов
import java.net.URI;
import java.net.http.*;
import java.util.concurrent.*;
HttpClient client = HttpClient.newHttpClient();
HttpRequest r1 = HttpRequest.newBuilder(URI.create("https://httpbin.org/get?i=1")).GET().build();
HttpRequest r2 = HttpRequest.newBuilder(URI.create("https://httpbin.org/get?i=2")).GET().build();
CompletableFuture<HttpResponse<String>> f1 = client.sendAsync(r1, HttpResponse.BodyHandlers.ofString());
CompletableFuture<HttpResponse<String>> f2 = client.sendAsync(r2, HttpResponse.BodyHandlers.ofString());
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2).thenRun(() -> {
System.out.println(f1.join().statusCode());
System.out.println(f2.join().statusCode());
});
all.join();
200 200
Параллельное выполнение экономит время при множестве независимых запросов.
Advanced 2. Получение тела как поток байтов (Reactive через Flow.Publisher)
import java.net.URI;
import java.net.http.*;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Flow;
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://httpbin.org/stream-bytes/1024"))
.GET().build();
CountDownLatch latch = new CountDownLatch(1);
client.sendAsync(req, HttpResponse.BodyHandlers.ofPublisher())
.thenAccept(resp -> {
Flow.Publisher<ByteBuffer> pub = resp.body();
pub.subscribe(new Flow.Subscriber<ByteBuffer>(){
Flow.Subscription s;
@Override public void onSubscribe(Flow.Subscription subscription){ s = subscription; subscription.request(1); }
@Override public void onNext(ByteBuffer item){ System.out.println("Chunk: " + item.remaining()); s.request(1); }
@Override public void onError(Throwable throwable){ throwable.printStackTrace(); latch.countDown(); }
@Override public void onComplete(){ System.out.println("Completed"); latch.countDown(); }
});
});
latch.await();
Chunk: 512 Chunk: 512 Completed
Подход полезен при обработке больших потоков без буферизации всего содержимого в память.
Advanced 3. WebSocket через HttpClient.newHttpClient()
import java.net.http.*;
import java.net.URI;
import java.util.concurrent.CompletionStage;
HttpClient client = HttpClient.newHttpClient();
WebSocket webSocket = client.newWebSocketBuilder()
.buildAsync(URI.create("wss://echo.websocket.org"), new WebSocket.Listener(){
@Override public void onOpen(WebSocket ws){ System.out.println("open"); ws.sendText("hello", true); }
@Override public CompletionStage<?> onText(WebSocket ws, CharSequence data, boolean last){ System.out.println("recv: " + data); return null; }
}).join();
// демонстрация небольшой задержки
Thread.sleep(1000);
webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "bye");
open recv: hello
WebSocket реализован в том же модуле и создаётся через newWebSocketBuilder() у экземпляра клиента.
Advanced 4. Обход ограничения newHttpClient() для специфичных настроек
// если требуется прокси, кастомный SSL или таймаут
HttpClient client = HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(5))
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
// несмотря на то что newHttpClient() возвращает готовый объект, для продвинутой конфигурации предпочтительнее newBuilder()
(создаётся настроенный HttpClient)
Для сценариев, требующих контроля над поведением соединений, рекомендуется строить клиент через builder.
джава HttpClient.newHttpClient function comments
- джава HttpClient.newHttpClient - аргументы и возвращаемое значение
- Функция java HttpClient.newHttpClient - описание
- HttpClient.newHttpClient - примеры
- HttpClient.newHttpClient - похожие методы на java
- HttpClient.newHttpClient на javascript, c#, python, php
- HttpClient.newHttpClient изменения java
- Примеры HttpClient.newHttpClient на джава