Кратко
Если вам нужно использовать язык Java для запроса HTTP-ресурсов, вы можете столкнуться с несколькими решениями, и в конечном итоге вы можете сделать это разумным способом — со ссылкой на сторонний пакет.
Хорошие новости, хорошие новости, Хуан Хэ вернулся со своей невесткой, и кожевенный завод спасен: Java9 поставляется с совершенно новым HTTP-клиентским API в дополнение к своей модульности. Не только поддерживает HTTP2.0, но также предоставляет набор аффинити API. Итак, давайте сдернем таинственную кружевную фату моей невестки.
Что такое HTTP2.0?
HTTP2.0 приносит захватывающие новые функции: (это не из исходного текста)
- Бинарное кадрирование
- Конвейерный запрос/ответ
- Асинхронное соединение
- мультиплексирование
- Server Push Streaming (технология Server Push)
- Длинное соединение на основе TCP
- сжатие заголовка
Таким образом, мы нацелились на пухлый HTTP2.0.
Модуль инкубатора
Здесь следует отметить, что построение HTTP-клиента в Java 9 зависит от модуля инкубатора и не только:
- В JDK 9 этот модуль называется
jdk.incubator.httpclient
- Модуль инкубатора будет доступен в JDK10.
java.httpclient
заменены - JDK10 станет крупным прорывом в этом отношении (теперь кто знает?)
HTTP-клиентский API для Java 9
По сути, при общении по HTTP задействованы три класса:HttpClient
будет использоваться для отправкиHttpRequest
и получитьHttpResponse
. Этот API относительно прост для понимания, не так ли? Давайте посмотрим:
Базовый пример: запрос GET, возвращаемая строка
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de/"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.body());
Очень элегантно, правда? нетInputStream
иReader
быть вовлеченным, - в свою очередь черезBodyHandler
чтобы получить строку непосредственно из ответа. Без лишних слов, он будет представлен нижеBodyHandlers
.
Несмотря на то чтоHttpClient
,HttpRequest
иHttpResponse
Он играет важную роль в обмене данными HTTP2.0, но нам все равно придется использовать его с Builder.Builder
Предоставляет набор кратких и простых для понимания API.
HttpRequest.Builder
Мы можем позвонитьHttpRequest.newBuilder()
чтобы получитьHttpRequest.Builder
пример, как в первом примере. Мы будем использовать его для настройки всего, что связано с конкретным запросом. Вот исходный код:
// HttpRequest.Builder
public abstract static class Builder {
// note: some methods left out for the sake of brevity
public abstract Builder uri(URI uri);
public abstract Builder version(HttpClient.Version version);
public abstract Builder header(String name, String value);
public abstract Builder timeout(Duration duration);
public abstract Builder GET();
public abstract Builder POST(BodyProcessor body);
public abstract Builder PUT(BodyProcessor body);
public abstract Builder DELETE(BodyProcessor body);
public abstract HttpRequest build();
}
Очень читабельно (не требует пояснений), не так ли? использует связанные вызовы методов для завершения конфигурации запрошенного контента, а затем вызывает build() для полученияHttpRequest
пример.
HttpClient.Builder
иHttpRequest
Точно так же мы называемHttpClient.newBuilder()
получитьHttpClient.Builder
пример. Он предоставляет API для настройки некоторых более общих вещей о нашем соединении. Вот исходный код:
// HttpClient.Builder
public abstract static class Builder {
public abstract Builder cookieManager(CookieManager cookieManager);
public abstract Builder sslContext(SSLContext sslContext);
public abstract Builder sslParameters(SSLParameters sslParameters);
public abstract Builder executor(Executor executor);
public abstract Builder followRedirects(Redirect policy);
public abstract Builder version(HttpClient.Version version);
public abstract Builder priority(int priority);
public abstract Builder proxy(ProxySelector selector);
public abstract Builder authenticator(Authenticator a);
public abstract HttpClient build();
}
Это чисто белый! ! Хорошая понятность помогает IDE лучше служить вашей цели.
Дополнительные примеры клиентских приложений Java 9 HTTP
Увидев этот многообещающий API выше, давайте взглянем еще на несколько примеров его применения.
1. Сохраните запрос GET в файл
Чтобы сохранить загруженный файл локально, используйте HttpResponse.BodyHandler.asFile(Path):
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de/"))
.GET()
.build();
Path tempFile = Files.createTempFile("consol-labs-home", ".html");
HttpResponse<Path> response = client.send(request, HttpResponse.BodyHandler.asFile(tempFile));
System.out.println(response.statusCode());
System.out.println(response.body());
2. Загрузить файл через POST
Загрузка локальных файлов с помощью POST также становится очень простой, используя HttpRequest.BodyProcessor:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:8080/upload/"))
.POST(HttpRequest.BodyProcessor.fromFile(Paths.get("/tmp/file-to-upload.txt")))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.discard(null));
System.out.println(response.statusCode());
3. Асинхронный HTTP-запрос
Асинхронные HTTP-запросы также упрощаются благодаряHttpClient#sendAsync()
заменятьHttpClient#send
. Если сервер поддерживает, можно даже отменить выполнение запроса:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de/"))
.GET()
.build();
CompletableFuture<HttpResponse<String>> response = client.sendAsync(request, HttpResponse.BodyHandler.asString());
Thread.sleep(5000);
if(response.isDone()) {
System.out.println(response.get().statusCode());
System.out.println(response.get().body());
} else {
response.cancel(true);
System.out.println("Request took more than 5 seconds... cancelling.");
}
4. Используйте системные настройки прокси
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.getDefault())
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.body());
5. Базовая аутентификация Базовая аутентификация
HttpClient client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("username", "password".toCharArray());
}
})
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.body());
в заключении
Приведенный выше пример показывает, что проще использовать стандартный API Java 9 для отправки HTTP-запросов. Кроме того, мы сможем элегантно обработать ответ. Конечно, некоторые трехсторонние пакеты имеют схожие приятные особенности, но нужно выбрать достойное готовое решение.
оригинал:/разработка labs.con Sol.…