🥂 重定向
HTTP 请求在接收到301
、302
、307
等响应状态码时,就默认为重定向请求,浏览器和一些客户端会自动触发重定向,即发起一个新的请求跳转到新的URL
# 自动重定向
打开/关闭全局自动重定向配置
forest:
# 全局自动重定向开关,默认为开启
auto-redirection: true # true 为开启,false 为关闭
1
2
3
2
3
除了全局开关,还可以使用 @Redirection 注解,它能控制到具体的接口和方法
// 打开整个接口的自动重定向
@Redirection
public interface MyTestClient1 {
// 默认接口配置的重定向开关,即打开自动重定向
@Get("/")
String getData1();
// 关闭某个方法的重定向
@Redirection(false)
@Get("/")
String getData2();
... ...
}
// 关闭整个接口方法的自动重定向
@Redirection(false)
public interface MyTestClient2 {
// 默认接口配置的重定向开关,即关闭自动重定向
@Get("/")
String getData1();
// 打开某个方法的重定向
@Redirection
@Get("/")
String getData2();
... ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 处理和获取重定向信息
# 使用拦截器处理重定向
对于自动重定向的请求来说,无法通过请求方法返回得到跳转前的请求/响应信息,所以得通过拦截器来处理
拦截器的 onRedirection
方法会在重定向跳转请求发送前触发,以此获得以一次的Request和Response对象,
即返回 301
、302
等状态码的响应对象
同时,还能对地址转移请求做修改
/**
* 在拦截器中可以重写 onRedirection 方法
* 该方法可以获取和处理重定向请求相关信息
*/
public class RedirectInterceptor implements Interceptor<Object> {
@Override
public void onRedirection(ForestRequest<?> redirectReq, ForestRequest<?> prevReq, ForestResponse<?> prevRes) {
// 获取跳转前的请求信息
String prevUrl = prevReq.getUrl();
// 获取跳转前的响应信息
String location = prevRes.getHeader("Location");
// 如有需要,可以对即将跳转的新请求做修改
redirectReq.addBody("foo", "bar");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 使用 ForestResponse 处理重定向
对于已经关闭自动重定向的请求来说,可以直接通过方法返回的跳转前的响应对象(即获得301
、302
等状态码的响应对象)
/**
* 关闭了自动重定向
* 需要将方法返回值设为 ForestResponse 类型
*/
@Redirection(false)
@Get("/")
ForestResponse<String> getData();
1
2
3
4
5
6
7
2
3
4
5
6
7
通过ForestReposne.isRedirection()
判断是否需要重定向跳转,再通过ForestResponse.redirectionRequest()
获取重定向Url转移请求对象
// 调用接口获得转移前的响应对象
ForestResponse<String> response = client.getData();
// 判断是否需要重定向跳转
if (response.isRedirection()) {
// 获得即将跳转的请求对象
ForestRequest redirectReq = response.redirectionRequest();
// 如有需要,可以对添加请求进行修改
redirectReq.addBody("foo", "bar");
// 执行跳转
String result = redirectReq.executeAsString();
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 重定向日志
在开启自动重定向的情况下,重定向的请求日志形式如下
[Forest] Request (okhttp3):
[Redirect]: From POST http://localhost:59006/ -> 301
POST http://localhost:59006/b HTTP
1
2
3
2
3
[Forest] Request (httpclient):
[Redirect]: From POST http://localhost:59006/c -> 301
POST http://localhost:59006/d HTTP
1
2
3
2
3
帮助我们改善此文档 (opens new window)
上次更新: 2023/06/19, 17:37:19