Начало работы и практика API Java9 Http2.0

Java задняя часть сервер API
Начало работы и практика API Java9 Http2.0

Кратко

Если вам нужно использовать язык 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.…