java11 http客户端示例
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特性。