Okhttp重定向处理

重定向

客户端向服务器发送一个请求,获取对应的资源,服务器收到请求后,发现请求的这个资源实际放在另一个位置,于是服务器在返回的响应头的Location字段中写入那个请求资源的正确的URL,并设置reponse的状态码为30x 。

相关状态码说明

Okhttp代码中的实现

RetryAndFollowUpInterceptorintercept方法中构建了while (true)循环,根据response重建requestRequest followUp = followUpRequest(response)

判断是否需要重定向的逻辑在followUpRequest方法中:

1.如果响应码是307 或者308并且请求方法不是 GET 或者 HEAD 请求不进行重定向。
2.重定向的地址从响应头中获取 “Location”。
3.HTTPS 和 HTTP 之间的重定向,需要根据配置 followSslRedirects 来判断。final boolean followSslRedirects; //安全套接层重定向
4.如果请求不是PROPFIND的重定向,重定向后的请求会转为GET请求。

我们项目中的请求大都是POST请求或者GET请求,有时候为了安全考虑,全部都用POST请求,在遇到重定向的时候会被转成GET请求,或者我们的重定向状态码使用的是307,并且请求方法是GET,Okhttp就不支持了。这就不符合我们的要求了。有时候还可能实现跨域重定向,如:HTTP -> HTTPS。

既然Okhttp默认的实现不能满足我们的要求,就需要我们自己去实现,其实实现很简单,我们只需要自定义一个拦截器,判断重定向的响应码,然后从响应头中获取重定向后的地址,重新请求一遍即可。

重定向处理

//处理重定向的拦截器
public class RedirectInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        okhttp3.Request request = chain.request();
        Response response = chain.proceed(request);
        int code = response.code();
        if (code == 307) {
            //获取重定向的地址
            String location = response.headers().get("Location");
            LogUtils.e("重定向地址:", "location = " + location);
            //重新构建请求
            Request newRequest = request.newBuilder().url(location).build();
            response = chain.proceed(newRequest);
        }
        return response;
    }
}

 //使用
 OkHttpClient client = new OkHttpClient.Builder()
                    .followRedirects(false);  //禁制OkHttp的重定向操作,我们自己处理重定向
                    .addInterceptor(new RedirectInterceptor())
                    .build();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 7,846评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,282评论 19 139
  • 2系列200 OK请求已成功,请求所希望的响应头或数据体将随此响应返回。201 Created请求已经被实现,而且...
    Y像梦一样自由阅读 8,978评论 1 5
  • 做人,要真! 2017-03-15沟通技巧 我喜欢高兴时开怀大笑 哪怕丢了形象 我喜欢伤心时尽情流泪 尽管没了颜面...
    ZhouWG阅读 1,229评论 0 0
  • 小时候第一次看见结婚是邻居李婶嫁闺女,因为两家挨着所以李姐姐跟我们关系很好。 李姐姐长得很漂亮,用现在话来说称得上...
    花间醉_ba4b阅读 3,459评论 0 3

友情链接更多精彩内容