Примечания по обновлению HttpClient5 — глава API
Примечания по обновлению HttpClient5 — глава API

Недавно я, наконец, не смог устоять перед желанием обновиться и обновил версию HttpClient моего проекта с 4 до 5. Процесс был непростым, и многие изменения API затрудняли его запуск.

Apache HttpClient 5 (также известный как HttpClient 5.x) является важным компонентом проекта Apache HttpComponents и используется для отправки HTTP-запросов и обработки HTTP-ответов. Это дает множество преимуществ при общении и обработке данных в сети:

  1. Модульная конструкция: HttpClient 5 Модульная конструкция позволяет разделить основные функции на различные модули. Такая конструкция позволяет пользователям выборочно вводить и использовать различные функциональные модули в соответствии со своими потребностями, тем самым уменьшая сложность зависимостей.
  2. Широкие возможности настройки: Предоставляет богатые возможности и возможности настройки конфигурации, что позволяет разработчикам управлять конфигурациейсоединять, тайм-аутами и актерским мастерством в соответствии с конкретными потребностями. мастерство, политика безопасности и другие параметры.
  3. Асинхронная поддержка: Обеспечивает поддержку Асинхронного запросизподдерживать,Вы можете отправлять запросы и обрабатывать ответы асинхронно.,Помогает улучшить параллелизм и производительность системы.
  4. Оптимизированное управление соединениями: представлять Понятноболее гибкийи Эффективныйизсоединятьмеханизм управления,включатьсоединять Управление бассейном、соединятьповторное использование,Может эффективно сократить время установления и отключения соединения.,Улучшение использования ресурсов.
  5. Поддержка HTTP/2: поддерживать HTTP/2 протокол, который позволяет клиентам использовать HTTP/2 Общайтесь, повышая производительность и эффективность, особенно при обработке большого количества параллельных запросов.
  6. Поддерживаются новейшие стандарты и протоколы: поддерживатьдо настоящего временииз HTTP стандарты и протоколы, включая HTTP/1.1、HTTP/2、TLS/SSL и т. д., так что HttpClient 5 Оставайтесь в курсе событий и будьте конкурентоспособны как в плане безопасности, так и в производительности.
  7. Оптимизированная структура и производительность кода: Переработанная и оптимизированная структура кода делает HttpClient 5 Более эффективная и надежная обработка запросов и ответов.
  8. Простой в использовании API: Обеспечивает простоту в использовании API, который позволяет отправлять HTTP Запрос и обработка ответов становится более интуитивно понятным и простым.

Что касается вышеуказанных преимуществ, я чувствую лишь немного, но стоимость намного выше, чем преимущества. После простой самопроверки общее ощущение качественно не улучшилось. Единственное, что меня привлекает — это поддержка HTTP/2. Однако интерфейс протокола локально не разработан и не тестировался. Текущим мейнстримом по-прежнему является HTTP 1.1.

Это версия зависимостей, обновленная до HttpClient 5 в проекте FunTester.

Язык кода:javascript
копировать
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.3</version>
        </dependency>

Зависимые версии остаются без изменений. Если другие библиотеки в вашем проекте зависят от версии HttpClient 4.x, не забудьте исключить их, чтобы избежать помех.

Давайте начнем делиться изменениями API в произвольном порядке, перечисленными сверху вниз, в соответствии с моим проектом FunTester. В следующих вопросах старая версия относится к 4.x, а новая версия — к 5.3.

имя пакета

имя пакет изменен на org.apache.hc.client5. На начальном этапе требуется много ручной работы.

Попробуйте еще раз

В старой версии он назывался HttpRequestRetryHandler, а новая версия называется HttpRequestRetryStrategy У китайцев должна быть стратегия повторного тестирования. Существуют также различия в методах реализации. Метод старой версии public boolean retryRequest(IOException exception, int executionCount, HttpContext context) ,В новой версии необходимо реализовать несколько методов.:public boolean retryRequest(HttpRequest httpRequest, IOException e, int i, HttpContext httpContext)public boolean retryRequest(HttpResponse httpResponse, int i, HttpContext httpContext)public TimeValue getRetryInterval(HttpResponse httpResponse, int i, HttpContext httpContext) Первый метод очень похож на старый интерфейс, и код можно применять напрямую. Второй метод используется для оценки ответной информации. еще раз этот метод довольно хорош и очень востребован. Третий способ получить пробу еще раз интервал, так как я не ставил функцию изменения, то она бесполезна. Но все обращают внимание на введение новых категорий. org.apache.hc.core5.util.TimeValue , в HttpClient В версии 5 этот класс широко используется в качестве конфигурации времени.

Конфигурация подключения

Новая версия отменяет пакет API. Вот мой старый код:

Язык кода:javascript
копировать
        ConnectionConfig connectionConfig = ConnectionConfig.custom().setMalformedInputAction(CodingErrorAction.IGNORE).setUnmappableInputAction(CodingErrorAction.IGNORE).setCharset(Constant.DEFAULT_CHARSET).setMessageConstraints(messageConstraints).build();

Вот новый код:

Язык кода:javascript
копировать
ConnectionConfig connectionConfig = ConnectionConfig.custom()// настраивать Конфигурация подключения  
        .setConnectTimeout(Timeout.of(Duration.ofMillis(CONNECT_TIMEOUT))) // Установить таймаут соединения  
        .setSocketTimeout(Timeout.of(Duration.ofMillis(SOCKET_TIMEOUT))) // настраивать socket тайм-аут  
        .setTimeToLive(Timeout.of(Duration.ofMillis(MAX_ACCEPT_TIME))) // настройкивремя выживания  
        .setValidateAfterInactivity(Timeout.of(Duration.ofMillis(MAX_ACCEPT_TIME))) // настройки Подтвердить после неактивности  
        .build();

В целом особой разницы нет. Последние два пункта Конфигурации не важны для тестирования производительности, ведь у ресурса соединения есть еще менеджер соединения и асинхронное восстановление. отвечает поток ресурсов.

менеджер пула соединений

Старый код:

Язык кода:javascript
копировать
// Обрабатывать https-запросы таким образом, чтобы обходить проверку.
        // настраиватьпротоколhttpиhttpsпереписыватьсяизиметь дело сsocketФабрика ссылокизобъект
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)).build();
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, dnsResolver);
        // ограничения сообщений
        MessageConstraints messageConstraints = MessageConstraints.custom().setMaxHeaderCount(HttpClientConstant.MAX_HEADER_COUNT).setMaxLineLength(HttpClientConstant.MAX_LINE_LENGTH).build();

Новый код по-прежнему отменяет некоторые API.,Самым большим изменением является создание API.,Хотя существует множество перегруженных методов построения PoolingHttpClientConnectionManager.,Но приказ записан,я просто хочунастраивать Конфигурация подключенияиDNSпарсер,Если вы используете конструктор,Вы должны использовать параметр N,Очень некрасиво. Для завершения рекомендуется использовать Builder.,Давайте посмотрим на исходный код метода build():

Язык кода:javascript
копировать
        PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(RegistryBuilder.create().register(URIScheme.HTTP.id, PlainConnectionSocketFactory.getSocketFactory()).register(URIScheme.HTTPS.id, this.sslSocketFactory != null ? this.sslSocketFactory : (this.systemProperties ? SSLConnectionSocketFactory.getSystemSocketFactory() : SSLConnectionSocketFactory.getSocketFactory())).build(), this.poolConcurrencyPolicy, this.poolReusePolicy, (TimeValue)null, this.schemePortResolver, this.dnsResolver, this.connectionFactory);

По умолчанию для менеджера зарегистрирован фабричный класс HTTP-соединения. пула соединенийсерединаиз,Так что не надо повторятьнастраивать Понятно,И нет никакой бронинастраиватьHTTPизAPI。

асинхронный менеджер пула соединений Почти то же самое,Существует TlsStrategy, которого нет у менеджера синхронизации.,настраиватьметодследующее:

Язык кода:javascript
копировать
.setTlsStrategy(new BasicClientTlsStrategy(sslContext))

Конструктор использует метод create() для создания нового API, в то время как старый API по-прежнему использует custom().

Запросить конфигурацию

существовать Запросить В конфигурации многие API до сих пор отменены, главным образом потому, что боятся дублирования соединения. Элементы, я предпочитаю это, одна и та же конфигурация в нескольких местах вызовет дополнительные проблемы и затраты на устранение неполадок. код выглядит следующим образом:

Язык кода:javascript
копировать
private static RequestConfig getRequestConfig() {  
    return RequestConfig.custom().setConnectionRequestTimeout(Timeout.ofMilliseconds(CONNECT_REQUEST_TIMEOUT)).setCookieSpec("ignoreCookies").setRedirectsEnabled(false).build();  
}

Существует довольно неудобная настройка cookieSpec. API сохраняется, но класс перечисления элемента конфигурации отменяется. Затем он заменяется строкой и включается потерянное содержимое:

Язык кода:javascript
копировать
@Deprecated  
public static final String BROWSER_COMPATIBILITY = "compatibility";  
public static final String NETSCAPE = "netscape";  
public static final String STANDARD = "standard";  
public static final String STANDARD_STRICT = "standard-strict";  
/** @deprecated */  
@Deprecated  
public static final String BEST_MATCH = "best-match";  
public static final String DEFAULT = "default";  
public static final String IGNORE_COOKIES = "ignoreCookies";

При тестировании производительности нет необходимости CookieStore для управления файлами cookie, поэтому игнорируйте их.

СоздатьHttpClient

Я использовал новый API org.apache.hc.client5.http.impl.classic.HttpClientBuilder#disableCookieManagement Глядя на документ с исходным кодом, кажется, что он отменен. CookieStore Конфигурация, поскольку я проектировал ее в обоих местах, никаких отклонений пока не обнаружил.

Перехватчик

Есть еще один параметр метода, Старый код:

Язык кода:javascript
копировать
            public void process(HttpResponse httpResponse, HttpContext httpContext)

Новый код:

Язык кода:javascript
копировать
public void process(HttpResponse httpResponse, EntityDetails entityDetails, HttpContext httpContext)

Восстановление ресурсов

менеджер пула соединений имеет два доступных восстановления Метод ресурсов обычно вызывается асинхронно, чтобы предотвратить исключения ресурсов:

Язык кода:javascript
копировать
connManager.closeExpiredConnections();
connManager.closeIdleConnections(HttpClientConstant.IDLE_TIMEOUT, TimeUnit.SECONDS);

Новый код выглядит следующим образом:

Язык кода:javascript
копировать
connManager.closeExpired();  
connManager.closeIdle(TimeValue.ofSeconds(IDLE_TIMEOUT));

асинхронный клиент

запускатьасинхронный Метод start() клиента остается неизменным, но есть некоторые различия в логике принятия решения в исходном коде, особенно в атрибутах статуса. Старый код:

Язык кода:javascript
копировать
public void start() {  
    if (this.status.compareAndSet(CloseableHttpAsyncClientBase.Status.INACTIVE, CloseableHttpAsyncClientBase.Status.ACTIVE) && this.reactorThread != null) {  
        this.reactorThread.start();  
    }  
  
}

Новый код:

Язык кода:javascript
копировать
public final void start() {  
    if (this.status.compareAndSet(AbstractHttpAsyncClientBase.Status.READY, AbstractHttpAsyncClientBase.Status.RUNNING)) {  
        DefaultConnectingIOReactor var10001 = this.ioReactor;  
        this.executorService.execute(var10001::start);  
    }  
  
}

актерское мастерство

По старому кодексу актерское мастерство Конфигурацияможет быть напрямуюсуществоватьHttpClientсерединанастраивать,Новый код сделает API настроек устаревшим,нуждатьсясуществоватьRequestConfigсерединанастраивать Только тогда,Код остается неизменным,следующее:

Язык кода:javascript
копировать
setProxy(new HttpHost(ip, port))

Имена объектов запроса и ответа

Включено большое количество объектов, начиная с классического, например org.apache.hc.core5.http.message.BasicClassicHttpRequestorg.apache.hc.core5.http.ClassicHttpResponse , а также стала осуществляться регистрация объектов HTTP-запросов различных номеров пакетов. org.apache.hc.client5.http.classic.methods . Кажется, эта версия возвращается к классике.

интерфейс объекта

В старой версии кода, если вы хотите обработать объект запроса или ответа, вы должны быть org.apache.http.HttpEntityEnclosingRequest объект, в новой версии кода становится org.apache.hc.core5.http.HttpEntityContainer и отменено boolean expectContinue() метод.

Все сотрудники несут сущности

В устаревшем коде,Запросы GET и DELETE по умолчанию не содержат объект запроса.,Если вы хотите реализовать эту функцию, вам нужно реализовать ее самостоятельно.,Новая версия в разработке,Все сотрудники несут сущности. Это изменение по-прежнему приветствуется.

Настройка объекта

Также есть некоторые изменения в API настройки объекта.,Оказалось, чтонастраиватьStringВведите формат кодировки,сейчассуществоватьпрямойнастраивать java.nio.charset.Charset , какое большое улучшение.

Получить заголовок

Имя метода изменилось с getAllHeader на getHeaders, больше ничего.

строка ответа

HttpClient 5Отменено Получить строку ответаизизAPI getStatusLine ,Если вы хотите получить код статуса,Пожалуйста, используйте:org.apache.hc.client5.http.impl.classic.CloseableHttpResponse#getCode Лично я считаю, что это неуместно. Это немного не соответствует структуре HTTP-запроса, но это действительно удобно.

Получить URI

Старая версияметод:getURI,Возврат URIобъекта,новая версия:getUri,также Возврат URIобъекта,Есть еще один getRequestUri Возвращает объект String. Это просто разница в капитализации. Интересно, это инструмент, который автоматически добавляет код для адаптации.

Асинхронный запрос

Также поддерживается Асинхронный в синхронизированном HttpClient запросиз,Устаревший код и запросы синхронизации Public Requests объект,новая версияувеличение кода Понятноновыйизпроситьобъект:org.apache.hc.client5.http.async.methods.SimpleHttpRequest,Этот класс понимает подклассы,также Не унаследовано от ранее упомянутогоиз HttpUriRequestBase,Такое ощущение, что это независимая ветка.。такой жеизответобъекттакжеда org.apache.hc.client5.http.async.methods.SimpleHttpResponse

HttpClient 5середина Оба предлагаются Понятносинхронизировать собъекткопироватьизметодcopy(),Странно то, что запрошенная копия помечена как устаревший метод.,Запутанное поведение. Из исходного кода видно, что запросы GET и POST можно создавать легко и быстро.

Существует метод прямого получения тела ответа org.apache.hc.client5.http.async.methods.SimpleHttpResponse#getBodyText,Взгляните,Освоить метод синхронизации непросто.

Подвести итог

Одно слово: бросать. Вызов API завершен, и позже мы поделимся другими изменениями на основе результатов тестирования.

Если нет большого спроса, не рекомендуется обновлять HttpClient 5.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.