Java如何使用HttpClient读取网站内容?

HTTP客户端API可用于通过网络请求HTTP资源。这个新API是作为Java11中的一个新API引入的。它支持HTTP/1.1和HTTP/2,还支持同步和异步编程模型。下面的代码片段向您展示了如何使用新的API来读取网站页面的内容。

在下面的代码中,我们首先使用newHttpClient()静态方法创建一个新的HttpClient实例。这相当于调用newBuilder().build()。这为我们提供了一个HttpClient实例,其中包含默认设置,比如使用“GET”请求方法作为默认设置。然后我们使用newBuilder()方法创建一个HttpRequest对象,设置请求URI并调用build()方法来构建HttpRequest对象。

接下来,我们通过调用HttpClient对象的send()方法来发送请求。这将发送给定的请求,必要时阻塞以获得响应。返回的HttpResponse对象包含由给定响应主体处理程序处理的响应状态、头和主体。

package org.nhooo.example.httpclient;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class ReadWebsiteContent {
    public static void main(String[] args) throws Exception {
        // 使用默认配置创建HttpClient对象。
        HttpClient httpClient = HttpClient.newHttpClient();

        // 创建HttpRequest对象并设置要请求的URI, 
        // 未定义时,默认请求方法是GET请求。
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://httpie.org/hello"))
            .GET()
            .build();

        // 发送请求并打印出返回的响应。
        HttpResponse<String> response = httpClient.send(request,
            HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));

        System.out.println("Status Code: " + response.statusCode());
        System.out.println("Headers    : " + response.headers().toString());
        System.out.println("Body       : " + response.body());
    }
}

这是我们使用上面的代码片段阅读的网站内容:

Status Code: 200
Headers    : java.net.http.HttpHeaders@2d299ad6 { {:status=[200], cf-cache-status=[DYNAMIC], cf-ray=[5875b78d5df2eb00-LAX], cf-request-id=[023d710c5b0000eb00b738f200000001], content-length=[116], content-type=[text/x-rst;charset=utf-8], date=[Tue, 21 Apr 2020 08:25:53 GMT], etag=["234b9a1fe19f125356a5396c8cc72d54493a2eef"], expect-ct=[max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"], server=[cloudflare], set-cookie=[__cfduid=d5bdb6d828be3bb85d0f1f4c2ff81041c1587457553; expires=Thu, 21-May-20 08:25:53 GMT; path=/; domain=.httpie.org; HttpOnly; SameSite=Lax]} }
Body       : 

Hello, World!