Forest Forest
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
  • 序言

    • 🎁 新手介绍
    • 📖 文档
    • 🌰 使用案例
    • 🕵️‍ 关于作者
    • 👨‍🎓 贡献者列表
  • 入门

    • 🎬 安装配置说明
    • 🏹 Springboot环境安装
    • 📐 Springboot环境配置
    • 🎯 Springboot环境使用
    • 🏹 Springboot3环境安装
    • 📐 Springboot3环境配置
    • 🎯 Springboot3环境使用
    • 🏹 Spring环境安装
    • 📐 Spring环境配置
    • 🎯 Spring环境使用
    • 🏹 Solon环境安装
    • 📐 Solon环境配置
    • 🎯 Solon环境使用
    • 🏹 原生Java环境安装
    • 📐 原生Java环境配置
    • 🎯 原生Java环境使用
    • 🧬 编程式接口
  • 配置项

    • 👜 Springboot环境配置项
    • 👝 Spring环境配置项
    • 👜 Solon环境配置项
    • 🎒 原生Java环境配置项
    • 📚 配置优先级/作用域
  • 声明式接口

    • 🧱 构建接口
    • 🍀 请求方法
    • 🚚 请求地址
    • 🎈 URL 参数
    • 🍭 请求头
    • 👔 请求体
    • 🍮 后端框架
    • 🧁 接口注解
    • 📬 接收数据
    • 🍛 数据转换
    • 🍓 成功/失败条件
    • 🍌 重试机制
    • 🥂 重定向
      • 自动重定向
      • 处理和获取重定向信息
        • 使用拦截器处理重定向
        • 使用 ForestResponse 处理重定向
      • 重定向日志
    • 🍔 Gzip解压
    • 🎂 日志管理
    • ⚽ 回调函数
    • 🍟 异步请求
    • 🛡️ HTTPS
    • 🍪 使用Cookie
    • 🛸 使用代理
    • 🍉 上传下载
    • 🚑 异常处理
  • 编程式接口

    • 请求API

      • 🚀 请求对象
      • 🚢 请求属性
      • ✨ 执行请求
      • 🎊 后端框架
      • 🎪 请求类型
      • 🔮 请求地址
      • 🧀 URL 参数
      • 🚅 请求头
      • 🚋 请求体
      • ⚓ 回调函数
      • 🚁 异步请求
      • 🥯 Cookie
      • 🍜 成功/失败条件
      • 🌶️ 重试机制
      • ⛵ 重定向
      • 🛰️ 请求代理
    • 响应API

      • 🌠 响应对象
      • ✒️ 读取数据
      • 🦋 响应状态码
      • 🏥 响应错误处理
      • 🎧 响应头
      • 🥞 Cookie
  • 模板表达式

    • 🍬 Hello World
    • 🍹 配置属性引用
    • 🍖 变量引用
    • 🥃 动态变量绑定
    • 🥗 参数序号引用
    • 🍍 引用对象属性
    • 🥝 调用对象方法
  • 高级特性

    • 🥪 拦截器
    • 🍏 自定义注解
    • 🍇 组合注解
    • 🥑 自定义转换器
  • v1.5.30文档
  • 声明式接口
公子骏
2022-07-01
目录

🥂 重定向

HTTP 请求在接收到301、302、307等响应状态码时,就默认为重定向请求,浏览器和一些客户端会自动触发重定向,即发起一个新的请求跳转到新的URL

# 自动重定向

打开/关闭全局自动重定向配置

forest:
  # 全局自动重定向开关,默认为开启
  auto-redirection: true # true 为开启,false 为关闭
1
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

# 处理和获取重定向信息

# 使用拦截器处理重定向

对于自动重定向的请求来说,无法通过请求方法返回得到跳转前的请求/响应信息,所以得通过拦截器来处理

拦截器的 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

# 使用 ForestResponse 处理重定向

对于已经关闭自动重定向的请求来说,可以直接通过方法返回的跳转前的响应对象(即获得301、302等状态码的响应对象)

/**
 * 关闭了自动重定向
 * 需要将方法返回值设为 ForestResponse 类型
 */
@Redirection(false)
@Get("/")
ForestResponse<String> getData();
1
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

# 重定向日志

在开启自动重定向的情况下,重定向的请求日志形式如下

[Forest] Request (okhttp3):
	[Redirect]: From POST http://localhost:59006/ -> 301
	POST http://localhost:59006/b HTTP
1
2
3
[Forest] Request (httpclient):
	[Redirect]: From POST http://localhost:59006/c -> 301
	POST http://localhost:59006/d HTTP
1
2
3
帮助我们改善此文档 (opens new window)
上次更新: 2023/03/13, 15:28:40
🍌 重试机制
🍔 Gzip解压

← 🍌 重试机制 🍔 Gzip解压→

Theme by Vdoing | Copyright © 2016-2023 公子骏 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式