Java如何使用HttpClient HEAD请求获取HTTP标头?

HTTP HEAD方法用于读取使用HTTP GET方法访问资源时返回的标头信息。 可以在决定下载大量资源以节省带宽之前完成此请求。 对HEAD方法的响应不应包含主体,在下面的代码中,我们使用HttpResponse.BodyHandlers.discarding(),这是一个丢弃响应主体的响应主体处理程序。

在下面的代码片段中,我们首先创建一个HttpClient实例,在本示例中,我们使用HttpClient.newBuilder().build()方法。 创建HttpClient之后,我们创建HttpRequest对象。 我们通过调用方法method()将HTTP方法设置为HEAD,并将字符串“ HEAD”作为方法名称,并将HttpRequest.BodyPublishers.noBody()传递给不发送请求主体的请求主体发布者。

下面代码中的下一步是使用headers()方法发送请求并从HttpResponse对象获取响应头。HttpHeaders对象的map()方法为我们提供服务器返回的头的键值。

package org.nhooo.example.httpclient;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HeadRequestExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newBuilder().build();

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://google.com"))
            .method("HEAD", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<Void> response = client.send(request,
            HttpResponse.BodyHandlers.discarding());

        //返回这个HttpHeaders的一个多视图多映射视图。
        //该映射包含字符串的键,其中字符串列表为
        //它的值。
        HttpHeaders headers = response.headers();        
        headers.map().forEach((key, values) ->
            System.out.printf("%s = %s%n", key, values));
    }
}

这是我们获取并打印到控制台屏幕的HTTP标头:

:status = [301]
alt-svc = [quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000]
cache-control = [public, max-age=2592000]
content-length = [220]
content-type = [text/html; charset=UTF-8]
date = [Wed, 22 Apr 2020 14:41:49 GMT]
expires = [Fri, 22 May 2020 14:41:49 GMT]
location = [https://www.google.com/]
server = [gws]
x-frame-options = [SAMEORIGIN]
x-xss-protection = [0]