java11 http客户端示例

时间:2020-02-23 14:37:03  来源:igfitidea点击:

Java11引入了HTTP客户机,可用于通过网络发送请求并检索其响应。HTTP客户机替换了HttpUrlConnection类,因为它被认为是旧的并且不支持易用性。HTTP客户端API同时支持HTTP/1.1和HTTP/2.

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

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

请求可以同步或者异步发送

send(HttpRequest,BodyHandler))将阻止,直到发送请求并收到响应

sendaync(HttpRequest,BodyHandler))发送请求,同时接收响应(异步)。此方法返回CompletableFuture,仅当响应可用时才完成。

HttpResponse.BodyHandler

允许在收到实际响应正文之前检查响应代码

HttpResponse.BodyHandlers

BodyHandlers的唯一目的是处理响应正文类型。一些例子:

  • BodyHandlers.ofByteArray()

  • BodyHandlers.ofString()

  • BodyHandlers.ofFile()

  • BodyHandlers.ofInputStream()

等。

数据为反应流

HttpClient实际上是请求正文的订阅者和响应正文字节的发布者

请求和响应主体公开为反应流(具有非阻塞背压的数据流)

HttpRequest.BodyPublisher

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

HttpRequest.bodypublisher

BodyPublishers::ofByteArray(byte[])

BodyPublishers::OffFile(路径)

BodyPublishers::ofString(字符串)

等。

HttpRequest.BodySubscriber

使用响应正文字节并将其转换为Java类型

这样,我们就可以看到一些实现了。首先,我们将发送GET请求:

HttpRequest request = HttpRequest.newBuilder()
             .uri(URI.create("https://theitroad.local/"))
             .build();

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

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

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpClient.newBuilder()
      .uri(URI.create("https://theitroad.local/")
      .version(Version.HTTP_1_1)
      .connectTimeout(Duration.ofSeconds(20))
      .authenticator(Authenticator.getDefault())
      .build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());

异步获取

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
             .uri(URI.create("https://theitroad.local/"))
             .connectTimeout(Duration.ofSeconds(20))
             .build();
client.sendAsync(request, BodyHandlers.ofString())
             .thenApply(HttpResponse::body)
             .thenAccept(System.out::println);

POST

HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://theitroad.local/"))
      .POST(BodyPublishers.ofString(data))
      .build();
HttpResponse<?> response = client.send(request, discarding());

小结

HTTP客户机的作用是替换URLConnection API,并在java11中作为javase平台的一部分进行了标准化,它位于java.net.http软件包。一个关键的优势是它使用了现代Java语言和API特性。