Skip to main content
Version: 1.5.x

重定向

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

自动重定向#

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

forest:  # 全局自动重定向开关,默认为开启  auto-redirection: true # true 为开启,false 为关闭

除了全局开关,还可以使用 @Redirection 注解,它能控制到具体的接口和方法

// 打开整个接口的自动重定向@Redirectionpublic interface MyTestClient1 {
    // 默认接口配置的重定向开关,即打开自动重定向    @Get("/")    String getData1();

    // 关闭某个方法的重定向    @Redirection(false)    @Get("/")    String getData2();        ... ...}
// 关闭整个接口方法的自动重定向@Redirection(false)public interface MyTestClient2 {
    // 默认接口配置的重定向开关,即关闭自动重定向    @Get("/")    String getData1();
    // 打开某个方法的重定向    @Redirection    @Get("/")    String getData2();        ... ...}

处理和获取重定向信息#

使用拦截器处理重定向#

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

拦截器的 onRedirection 方法会在重定向跳转请求发送前触发,以此获得以一次的Request和Response对象, 即返回 301302 等状态码的响应对象

同时,还能对地址转移请求做修改

/** * 在拦截器中可以重写 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");    }}

使用 ForestResponse 处理重定向#

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

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

通过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();}

重定向日志#

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

[Forest] Request (okhttp3):    [Redirect]: From POST http://localhost:59006/ -> 301    POST http://localhost:59006/b HTTP
[Forest] Request (httpclient):    [Redirect]: From POST http://localhost:59006/c -> 301    POST http://localhost:59006/d HTTP