一.总述
在Java中,HttpHeaders
是一个用于表示HTTP请求或响应头的类,它属于 java.net.http
包,从Java 11开始引入。这个类提供了一种方便的方式来操作HTTP消息头,包括添加、删除和获取头字段的值。
以下是 HttpHeaders
类的一些关键特性和用法:
不可变性:
HttpHeaders
实例是不可变的,这意味着一旦创建,就不能更改其内容。这有助于确保线程安全性。构建器模式:
HttpHeaders
的实例是通过构建器模式创建的,这允许你以一种灵活和链式的方式设置头字段。头字段操作:你可以使用
set
、add
、remove
和clear
等方法来操作头字段。遍历头字段:可以通过迭代器或使用
names
和values
方法来遍历头字段。获取头字段值:可以使用
firstValue
或allValues
方法来获取头字段的值。条件请求:
HttpHeaders
类还支持创建条件请求,例如If-Modified-Since
和If-None-Match
。
二.案例展示
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.URI;
import java.util.List;
public class HttpHeadersExample {
public static void main(String[] args) {
try {
// 创建HttpRequest对象
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://example.com"))
.headers(
HttpHeaders.of()
.set("Content-Type", List.of("application/json"))
.add("Accept", "application/json")
)
.build();
// 创建新的HttpHeaders实例
HttpHeaders headers = HttpHeaders.of()
.set("Authorization", "Bearer token_value")
.add("Custom-Header", "value1")
.remove("Custom-Header", "value1")
.build();
// 获取头字段的值
List<String> contentType = headers.allValues("Content-Type");
String firstValueOfAccept = headers.firstValue("Accept");
// 打印头字段的值
System.out.println("Content-Type: " + contentType);
System.out.println("First value of Accept: " + firstValueOfAccept);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在这个例子中,我们首先创建了一个 HttpRequest
对象,并在构建器中设置了一些头字段。然后,我们使用 HttpHeaders.of()
构建器创建了一个新的 HttpHeaders
实例,并对其进行了一些操作,如添加、删除和获取头字段的值。
三.set方法和add方法的区别
1. set 方法:
- 当你使用
set
方法时,它会将指定的头字段设置为一个特定的值。如果该头字段之前已经存在,set
方法会替换其所有现有的值。 set
方法接受一个头字段名和一个值(或者值的列表)。如果你传递一个值列表,该头字段将被设置为具有多个值,但在HTTP协议中,每个字段名只能对应一个值,即使它看起来像多个值,它们也会被合并为一个单一的头字段行。- 使用
set
方法可以确保你为特定的头字段提供一个精确的值或一组值,这可能对某些需要精确控制头字段值的场景很有用。
示例用法:
HttpHeaders headers = HttpHeaders.of()
.set("Content-Type", "application/json");
2. add 方法:
add
方法用于向现有的头字段添加额外的值。如果头字段不存在,add
方法会创建一个新的头字段,并添加指定的值。- 如果头字段已经存在,
add
方法将不会替换现有的值,而是将新值追加到现有值列表中。这意味着使用add
方法可以创建具有多个值的头字段。 add
方法允许你为已有的头字段添加更多的值,而不影响其他已存在的值。
示例用法:
HttpHeaders headers = HttpHeaders.of()
.add("Accept", "application/json")
.add("Accept", "text/html");
在这个例子中,set
方法将 “Content-Type” 头字段设置为 “application/json”,而 add
方法为 “Accept” 头字段添加了两个值:“application/json” 和 “text/html”。
区别总结:
set
方法用于设置或替换头字段的值。如果你为一个已存在的头字段使用set
,它将替换该头字段的所有现有值。add
方法用于向现有的头字段添加新的值。如果你为一个不存在的头字段使用add
,它将创建一个新的头字段。
在选择使用 set
还是 add
方法时,你需要根据你的具体需求来决定,例如,你是否需要替换现有的头字段值,或者是否需要为一个头字段添加多个值。
总结
HttpHeaders 类是Java 11及以后版本中处理HTTP头字段的推荐方式,提供了一种现代、灵活且线程安全的方法来操作HTTP消息头。