Это 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
Лучшая производительность, клиентские объекты многократно используются, многофункциональны и легко настраиваются.
Поэтому в реальной разработке выбирайте по своим реальным потребностям и сценариям, как говоритсяНет лучшего, есть только лучшее.
Я Сяо Хей, программист, который «выслеживает» Интернет.
Текущая вода не соревнуется за первое, а говорить дорого