🚅 请求头
一个HTTP请求由请求行、请求头、请求体三部分组成。其中,请求头是HTTP请求的重要组成部分,经常用于传递和服务端通讯的控制参数、数据格式、请求编码等重要信息。
请求头由零到多个头属性构成,而一个头属性通常是一个键值对。
# 添加请求头
ForestRequest 对象提供了添加和修改请求头的方法
addHeader(String name, Object value)
添加请求头
参数
name
: 请求头名称参数
value
: 请求头的值
// addHeader方法第一个参数为头属性名称,第二个参数为头属性的值
// 添加头属性 Content-Type,值为 application/json
request.addHeader("Content-Type", "application/json");
2
3
# 添加多个请求头
一个请求可以添加多个头属性
request.addHeader("Accept", "text/plain") // 添加第一个头属性
.addHeader("Content-Type", "application/json") // 添加第二个头属性
.addHeader("AccessToken", "foobar"); // 添加第三个头属性
// 最终请求包含以下头属性:
// User-Agent: forest/1.5.36
// Accept: text/plain
// Content-Type: application/json
// AccessToken: foobar
2
3
4
5
6
7
8
9
# User-Agent 请求头
其中, User-Agent
是特殊的通用请求头,所有的 Forest 请求都会默认自动加上User-Agent: forest/{version}
这样的请求头。
该请求头无法删除,但可以用其他的值来覆盖
// 覆盖方法一
request.addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)");
// 覆盖方法二
request.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)");
2
3
4
5
若被覆盖,则User-Agent
请求头的值就会自定义的User-Agent
内容
# 添加延迟请求头
延迟请求头参数 (也称作 Lambda 请求头参数),在您需要不马上求值的情况使用。
有很多情况,请求头的参数值不能马上得出,而是在请求发送前的那一刻(所有请求参数都到位时)才能得出,典型的例子就是加签验证的场景
addHeader(String name, Lazy lazyValue)
添加Lazy类型的请求头参数
- 参数
lazyValue
: 延迟求值的Query参数值(即 Lambda)
request.addHeader("name", req -> {
// req 为请求对象
// 返回值将作为参数值添加到 URL Query 中
return "";
});
2
3
4
5
在 Lambda 代码块中可以调用req.body().encodeToString()
将整个请求体的数据序列化为字符串
request.addHeader("token", req -> Base64.encode(req.body().encodeToString())) // 添加延迟参数
.addBody("a", 1)
.addBody("b", 2)
.addBody("c", 3);
// 最后产生 Header 参数 token: YT0xJmI9MiZjPTM=
2
3
4
5
# 修改请求头
修改和覆盖一个已存在的头属性
request.addHeader("Hello", "A") // 添加第一个头属性
.addHeader("Hello", "B"); // 覆盖第一个头属性
// 最终请求包含以下头属性:
// Hello: B
2
3
4
# 获取请求头
header(String name)
根据请求头名称获取请求头
- 参数
name
: 请求头名称- 返回值: 请求头,ForestHeader 类实例
headers()
获取所有请求头
- 返回值: 请求头表, ForestHeaderMap 类实例
// 创建新的请求对象
// url: http://localhost/test
ForestRequest<?> request = Forest.get("/")
.addHeader("Accept", "text/plain") // 添加第一个头属性
.addHeader("Content-Type", "application/json") // 添加第二个头属性
// 通过 header 方法可以根据头属性名获取请求头对象
// 并返回 ForestHeader 类的对象
ForestHeader header1 = request.header("Accept"); // 获取头属性 Accept
ForestHeader header2 = request.header("Content-Type"); // 获取头属性 Content-Type
// 通过 headers 方法可以获取该请求的所有请求头信息
// 并返回 ForestHeaderMap 类对象
ForestHeaderMap headerMap = request.headers(); // 获取请求的所有请求头
// 通过 headerValue 方法可以根据头属性名获取请求头的属性值
// 并返回属性值字符串
String headerValue1 = request.headerValue("Accept"); // 获取头属性 Accept 的属性值
String headerValue2 = request.headerValue("Content-Type"); // 获取头属性 Accept 的属性值
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 特殊请求头
Forest为一些特殊头属性定义专有的方法,不用在 addHeader 方法中传入头属性名了,比如: Content-Type
contentType(String contentType)
设置请求头 Content-Type 的值
- 参数
contentType
: 请求头 Content-Type 的值
// 设置头属性 Content-Type 的值为 application/json
request.contentType("application/json");
2
Forest也为 Content-Type
常用属性值的设置提供了快捷方法
// 设置头属性 Content-Type: application/x-www-form-urlencoded
request.contentFormUrlEncoded();
// 设置头属性 Content-Type: application/json
request.contentTypeJson();
// 设置头属性 Content-Type: application/xml
request.contentTypeXml();
// 设置头属性 Content-Type: multipart/form-data
request.contentTypeMultipartFormData();
// 设置头属性 Content-Type: application/octet-stream
request.contentTypeOctetStream();
2
3
4
5
6
7
8
9
10