Рубрики
Без рубрики

Беглый взгляд на HttpClient Java 11

Эта статья была первоначально опубликована в моем блоге Java 11 была выпущена в сентябре 2018 года и является первой… Помеченный как java, программирование.

Эта статья была первоначально опубликована на мой блог

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
HttpResponse response = 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”