Какой HTTP-клиент мне выбрать? зайди и посмотри

Java задняя часть
Какой HTTP-клиент мне выбрать? зайди и посмотри

Это 26-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.

предисловие

HTTP (протокол передачи гипертекста) – это протокол прикладного уровня, используемый для связи между клиентами и серверами. Он передает сетевые данные в соответствии со стандартными форматами, такими как JSON и XML. Он также используется в качестве RESTAPI для связи между приложениями. Общий протокол.

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

Есть много HTTP-клиентов на выбор. В этом выпуске в основном представлены инструменты HTTP-клиента, которые можно использовать в приложениях Java.

Обзор

Основные HTTP-клиенты, представленные в этой статье, включают:

  • HttpClient доступен в версиях Java 11+
  • HttpClient в проекте Apache HttpComponents
  • OkHttpClient
  • Веб-клиент в Spring Boot

Для лучшего сравнения мы будем использовать разные клиенты для выполнения асинхронных запросов GET и синхронных запросов POST соответственно в примере.

ПОЛУЧИТЬ запрос

Для запроса Get мы запрашиваем прогноз погоды на следующие 3 дня в Пекине, запрашивая следующий интерфейс.

Адрес запросаhttp://api.weatherdt.com/common/?area=101010100&type=forecast&key=645cc4f76d011bbd8717b1607d6cb9d7.

POST-запрос

Для запросов POST мы получаем доступhttps://getman.cn/echoТестовый интерфейс API, который принимает параметр JSON.

Для всех клиентских инструментов HTTP процесс отправки запроса в основном одинаков, включая следующие шаги:

  • Создайте экземпляр HTTP-клиента
  • Создайте объект Request для отправки запроса
  • Установите синхронный или асинхронный режим и вызовите
  • Обработка данных ответа HTTP

Затем используйте другой HTTP-клиент для завершения функциональности.

Собственный HttpClient JDK

РоднойHttpClientбыл представлен в Java 9 как инкубационный модуль, а затем официально доступен в Java11 как часть JEP 321,HTTPClientЗамена более раннего JDKHttpUrlConnectionДобрый.

HttpClientПоддерживаются следующие функции:

  • Поддержка протокола HTTP1.1, HTTP2.0
  • Поддерживает как синхронные, так и асинхронные модели программирования.
  • Поддерживает потоковую передачу запросов и ответов
  • Поддержка файлов cookie

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

использоватьHttpClientКод для выполнения асинхронного запроса GET выглядит следующим образом:

Создано с использованием шаблона построителя в приведенном выше коде.HttpClientа такжеHttpRequest, затем выполните асинхронные вызовы REST API.

При создании запроса мы вызываемget()метод задает метод HTTP дляGETи установите таймаут 10 секунд.

Синхронный POST-запрос

Для запросов POST вы можете позвонить построителюPOST(BodyPublisher Body)метод, вы можете использоватьHttpRequest.BodyPublishers.ofString(String requestBody)Преобразовать строку JSON вBodyPublisherкак параметр данных, который необходимо отправить.

В приведенном выше коде с помощьюprepareRequest()Метод имитирует строку JSON в качестве данных запроса, также используя шаблон построителя, черезPOST()Установите метод запроса POST, и для возвращаемого результата вы можете передатьHttpResponse.BodyHandlers.ofString()Преобразовать в строку.

Если вы используете JDK версии 11+ в своем проекте, лучше всего подойдет собственный HTTP-клиент.

Apache HttpComponents

HttpComponentsЭто проект с открытым исходным кодом Apache Software Foundation, включающий набор инструментов Java, который можно использовать с протоколом HTTP.

Компоненты в рамках этого проекта разделены на следующие две части:

HttpCore: набор низкоуровневых транспортных компонентов HTTP, которые можно использовать для создания пользовательских клиентских и серверных HTTP-сервисов;

HttpClient: реализация прокси-сервера HTTP, соответствующая протоколу HTTP на основе HttpCore.

В то же время он также предоставляет такие компоненты, как аутентификация клиента, управление состоянием HTTP и управление HTTP-соединением.

Во-первых, использование этого компонента требует добавления зависимости Maven:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.1.1</version>
</dependency>

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

использоватьApache HttpClientОбычный способ сделать асинхронный вызов REST API выглядит следующим образом:

Основные шаги заключаются в следующем:

  • Сначала создайтеCloseableHttpAsyncClientкак HTTP-клиент;
  • тогда позвониstart()способ запуска клиента;
  • использоватьSimpleHttpRequestсоздать запрос;
  • и позвонивExecute()способ отправки запроса и установкиFutureCallbackобъект для асинхронной обработки различных результатов ответа.

Синхронный POST-запрос

использоватьApache HttpClientКод для отправки синхронного запроса POST выглядит следующим образом:

Шаги для отправки синхронного POST-запроса следующие:

  • сначала черезprepareRequest()Метод создает строку JSON в качестве данных запроса;
  • СоздайтеHttpPostобъект в качестве экземпляра запроса POST и установите данные запроса и данные заголовка запроса вHttpPostв объекте;
  • пройти черезHttpClients.createDefault()Создайте экземпляр HTTP-клиента;
  • перечислитьexecute()способ отправки запроса;
  • возвращаемое значение изCloseableHttpResponseчтобы получить ответные данные.

Когда используемая версия JDK является версией ниже 11 или функция должна предоставляться в виде подключаемого модуля для других систем,Apache HttpClientэто лучший выбор.

OkHttpClient

OkHttpClientЭто также библиотека с открытым исходным кодом, предоставляемая Square в США.

Также необходимо добавить соответствующие зависимости Maven:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.2</version>
</dependency>

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

использоватьOkHttpClientКод для отправки асинхронного запроса GET выглядит следующим образом:

использоватьOKHttpClientШаги для создания запроса GET следующие:

  • Установите время ожидания чтения и записи в режиме построителя и создайте экземпляр HTTP-клиента;
  • использоватьRequest.Builder()создать экземпляр запроса;
  • использоватьOkHttpClient.newCall()Метод отправляет асинхронный запрос на получение;
  • пройти черезenqueue()Метод устанавливает обработку ответа на асинхронный запрос.

Синхронный POST-запрос

OKHttpClientОтправка кода синхронного POST-запроса выглядит так:

пройти черезOKHttpClientШаги для создания POST-запроса следующие:

  • перечислитьprepaareRequest()метод генерации данных запроса JSON;
  • Создано шаблоном строителяOkHttpClientэкземпляр клиента;
  • перечислитьRequestBody.create()Создать тело данных запроса;
  • перечислитьRequest.Builder()Создайте пример POST-запроса;
  • перечислитьexecute()Отправьте запрос и получите результат синхронноResponse.

OKHttpClientНи клиент, ни пример запроса не требуют ручного отключения, мы создаем единыйOkHttpClientЭкземпляры могут быть сделаныповторное использование, и OkHttpлучшее представление.

Spring WebClient

Spring WebClientпредставляет собой асинхронный реактивный HTTP-клиент, представленный в Spring 5 для замены старогоRestTemplate, так что при использованииSpring BootВызовы REST API выполняются в приложениях, созданных платформой, которая поддерживает синхронную, асинхронную и потоковую обработку.

использовать то же самоеSpring WebClientНеобходимо добавить зависимости Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>

Spring WebClientсуществуетSpring-boot-starter-webFluxпакет, Spring WebFlux является частью Spring 5 и обеспечивает поддержку реактивного программирования в веб-приложениях.

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

использоватьSpring WebClientПример кода для отправки асинхронного запроса GET выглядит следующим образом:

  • В этом фрагменте кода мы сначала создаем клиент с настройками по умолчанию;
  • Далее звоните клиентуget()метод и вызовuri()Метод задает API-адрес запроса;
  • в цепочке вызововretrieve()Метод используется для вызова API, то есть для отправки запроса;
  • а потом черезbodyToMono()метод для получения тела ответа, которое передается черезbodyToMono()метод преобразуется вMonoобъект;
  • Наконец, используйтеsubscribe()способ подписки неблокирующим образомbodyToMono()преобразование метода возвращеноMonoобъект.

Синхронный POST-запрос

Несмотря на то чтоSpring WebClientявляется асинхронным, но мы все же можем сделать синхронный вызов, вызвав метод block(), который блокирует поток до конца выполнения; возвращает результат после выполнения метода.

использоватьWebClientПример выполненного синхронного запроса POST выглядит следующим образом:

  • сначала черезWebClient.create()Создать HTTP-клиент;
  • пройти черезclient.post()Установите метод запроса POST;
  • пройти черезbody()метод будетprepaareRequest()Метод возвращает строку JSON в качестве данных запроса;
  • перечислитьexchange()метод отправляет запрос и инкапсулирует данные ответа вMonoобъект, чемretrieve()метод предоставляет больше методов работы;
  • перечислитьblock()Установите синхронную блокировку запроса.

как выбрать

В приведенном выше содержании этой статьи мы реализовали отправку синхронных запросов GET и асинхронных запросов POST с помощью различных клиентских инструментов.

Характеристики каждого инструмента можно резюмировать следующим образом:

  • Если вы не хотите добавлять какие-либо внешние библиотеки, а версия JDK вашего приложения — 11+, тогдаHTTPClientявляется первым выбором;

  • еслиSpring Bootприложение и является реактивным API, используйтеSpring WebClient;

  • Apache HttpClientОн более гибкий и имеет больше справочных документов, чем другие библиотеки;

  • OkHttpClientЛучшая производительность, клиентские объекты многократно используются, многофункциональны и легко настраиваются.

Поэтому в реальной разработке выбирайте по своим реальным потребностям и сценариям, как говоритсяНет лучшего, есть только лучшее.


Я Сяо Хей, программист, который «выслеживает» Интернет.

Текущая вода не соревнуется за первое, а говорить дорого