原文: https://javatutorial.net/java-11-http-client-example

Java 11 引入了 HTTP 客户端,该客户端可用于通过网络发送请求并检索其响应。 HTTP 客户端取代了旧的HttpUrlConnection类,并且不支持易用性。 HTTP 客户端 API 同时支持 HTTP/1.1 和 HTTP/2。

Java 11 HTTP 客户端示例 - 图1

HttpClient也是不可变的,这意味着它可以用于发送多个请求。

每个HttpRequest必须提供一个BodyHandler,并且其(BodyHandler)函数用于确定如何处理响应(如果有的话)。

可以同步或异步发送请求

Java 11 HTTP 客户端示例 - 图2

HttpResponse.BodyHandler

  • 允许在收到实际的响应主体之前检查响应代码

HttpResponse.BodyHandlers

存在BodyHandlers的唯一目的是处理响应主体类型。 一些例子:

  • BodyHandlers.ofByteArray()
  • BodyHandlers.ofString()
  • BodyHandlers.ofFile()
  • BodyHandlers.ofInputStream()
  • 等等

数据作为响应流

  • HttpClient实际上是请求正文的订阅者和响应正文字节的发布者
  • 请求和响应主体作为响应流(具有无阻塞背压的数据流)公开

HttpRequest.BodyPublisher

  • 将 Java 对象转换为适合作为请求正文发送的字节缓冲区

HttpRequest.BodyPublishers

  • BodyPublishers::ofByteArray(byte[])
  • BodyPublishers::ofFIle(Path)
  • BodyPublishers::ofString(String)
  • 等等

HttpRequest.BodySubscriber

  • 使用响应主体字节并将其转换为 Java 类型

顺便说一句,让我们看看一些实现。 首先,我们将发送 GET 请求:

  1. HttpRequest request = HttpRequest.newBuilder()
  2. .uri(URI.create("https://javatutorial.net/"))
  3. .build();

现在,让我们发送一个 HTTP 请求。 我将向您展示同步和异步示例:

同步(在HttpResponse可用之前将一直阻塞)GET

  1. HttpClient client = HttpClient.newHttpClient();
  2. HttpRequest request = HttpClient.newBuilder()
  3. .uri(URI.create("https://javatutorial.net/")
  4. .version(Version.HTTP_1_1)
  5. .connectTimeout(Duration.ofSeconds(20))
  6. .authenticator(Authenticator.getDefault())
  7. .build();
  8. HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
  9. System.out.println(response.statusCode());
  10. System.out.println(response.body());

异步 GET

  1. HttpClient client = HttpClient.newHttpClient();
  2. HttpRequest request = HttpRequest.newBuilder()
  3. .uri(URI.create("https://javatutorial.net/"))
  4. .connectTimeout(Duration.ofSeconds(20))
  5. .build();
  6. client.sendAsync(request, BodyHandlers.ofString())
  7. .thenApply(HttpResponse::body)
  8. .thenAccept(System.out::println);

POST

  1. HttpClient client = HttpClient.newBuilder().build();
  2. HttpRequest request = HttpRequest.newBuilder()
  3. .uri(URI.create("https://javatutorial.net/"))
  4. .POST(BodyPublishers.ofString(data))
  5. .build();
  6. HttpResponse<?> response = client.send(request, discarding());

总结

HTTP 客户端的角色是替换URLConnection API,并且在 Java 11 中作为 Java SE 平台的一部分进行了标准化,并且位于java.net.http包中。 一个主要优点是它使用了现代 Java 语言以及 API 功能。