Эта статья была первоначально опубликована на мой блог
Java 11 была выпущена в сентябре 2018 года и является первой версией с долгосрочной поддержкой после Java 8. Одной из его особенностей является HttpClient HttpClient , новый способ выполнения HTTP-запросов. В этом посте будет дан краткий обзор HttpClient и того, как он является столь необходимой заменой URLConnection !
Задача
Я создал страницу на своем сайте http://anthonybruno.dev/last-update это просто временная метка Unix с момента последнего создания сайта.
Задача проста, создайте какой-нибудь код, который запрашивает эту страницу и возвращает метку времени!
Использование URLConnection
Ниже приведен код , который использует URLConnection
.
// 1. Create URL object URL updateUrl = new URL("http://anthonybruno.com.au/last-update"); // 2. We use openConnection() on the url to get a HttpURLConnection, // that we have to cast(?!). Also, this doesn't actually make a // network request(?!?!?) HttpURLConnection connection = (HttpURLConnection) updateUrl.openConnection(); // 3. We can then set things like set request methods, headers. connection.setRequestMethod("GET"); // 4. Then we actually connect! Note: connect doesn't return anything, it // mutates the connection object! connection.connect(); int statusCode = connection.getResponseCode(); if (statusCode != 200) { throw new RuntimeException("Got non 200 response code! " + statusCode); } // 5. Content is returned in an InputStream (Don't forget to close it!) InputStream content = connection.getInputStream() Instant timestamp = processIntoInstant(content) // 6. Remember to disconnect! Note: HttpURLConnnection is not autoclosable! connection.disconnect()
После создания объекта URL
все быстро идет наперекосяк. Крайне нелогично использовать метод, называемый open Connection()
, который на самом деле не открывает соединение! Необходимость приведения возвращенного объекта URLConnection
к HttpURLConnection
для доступа к таким методам, как setrequestметод
и отсоединить
это просто глупо. Наконец, вызов connect()
(который фактически выполняет сетевой запрос!) Ничего не возвращает, вместо этого вы должны получить информацию об ответе от самого объекта connection
.
Использование HttpClient
Ниже приведен код, который использует HttpClient
. Вы увидите большую разницу.
// 1. Create HttpClient object HttpClient httpClient = HttpClient.newHttpClient(); // 2. Create URI object URI uri = URI.create(updateUrl); // 3. Build a request HttpRequest request = HttpRequest.newBuilder(uri).GET().build(); // 4. Send the request and get a HttpResponse object back! // Note: HttpResponse.BodyHandlers.ofString() just parses the response body // as a String HttpResponseresponse = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); int statusCode = response.statusCode(); if (statusCode != 200) { throw new RuntimeException("Got non 200 response code! " + statusCode); } Instant timestamp = processIntoInstant(response.body())
Теперь, разве это не намного приятнее, чем код URLConnection
, который мы видели раньше? Сначала мы создали HttpClient
объект, который будет отправлять наши запросы. Затем мы создаем экземпляр Http-запрос
объект, содержащий метод запроса, заголовки и т.д. Мы отправляем Http-запрос
, используя ранее созданный HttpClient
, возвращая нам хороший HttpResponse
объект.
Второй параметр в HttpClient.send
– это Обработчик тела
, который отвечает за синтаксический анализ тела ответа в нужном вам формате. Java предоставляет набор функций по умолчанию в Обработчике тела
, который охватывает общие случаи использования, такие как синтаксический анализ в Строку
, Файл
и Входной поток
. Конечно, можно создать свой собственный, который сам по себе заслуживает отдельной статьи.
Идея создания клиента, создания запросов и получения ответов немного более интуитивно понятна, чем использование URLConnection
! HttpClient
также поддерживает асинхронные запросы, HTTP/2 и websockets. Это заманчивая причина перейти с 8 на 11!
Код, использованный в этой статье, можно найти здесь
Оригинал: “https://dev.to/aussieguy/a-quick-look-at-java-11s-httpclient-1f79”