Forest,这款轻量级 HTTP 客户端 API 框架很强( 三 )


(1)RetryAndFollowUpInterceptor: 负责重定向:构建一个StreamAllocation对象,然后调用下一个拦截器获取结果,从返回结果中获取重定向的request,如果重定向的request不为空的话,并且不超过重定向最大次数的话就进行重定向,否则返回结果 。注意:这里是通过一个while(true)的循环完成下一轮的重定向请求 。
StreamAllocation为什么在第一个拦截器中就进行创建?

  • 便于取消请求以及出错释放资源 。
StreamAllocation的作用是什么?
  • StreamAllocation负责统筹管理Connection、Stream、Call三个实体类,具体就是为一个Call(Realcall),寻找( findConnection() )一个Connection(RealConnection),获取一个Stream(HttpCode) 。
(2)BridgeInterceptor: 负责将原始Requset转换给发送给服务端的Request以及将Response转化成对调用方友好的Response 。
具体就是对request添加Content-Type、Content-Length、cookie、Connection、Host、Accept-Encoding等请求头以及对返回结果进行解压、保持cookie等 。
(3)CacheInterceptor: 负责读取缓存以及更新缓存 。
  • 在请求阶段:
  • 读取候选缓存cacheCandidate;
  • 根据originOequest和cacheresponse创建缓存策略CacheStrategy;
  • 根据缓存策略,来决定是否使用网络或者使用缓存或者返回错误 。
(4)ConnectInterceptor: 负责与服务器建立连接,使用StreamAllocation.newStream来和服务端建立连接,并返回输入输出流(HttpCodec),实际上是通过
StreamAllocation中的findConnection寻找一个可用的Connection,然后调用Connection的connect方法,使用socket与服务端建立连接 。
(5)CallServerInterceptor: 负责从服务器读取响应的数据,主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response 。
3.4 设计模式(1)拦截器:责任链模式
Forest,这款轻量级 HTTP 客户端 API 框架很强

文章插图
 
(2)okhttpclient:外观模式
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new HttpLoggingInterceptor()).readTimeout(500, TimeUnit.MILLISECONDS).build();在这里,我们实例化了一个HTTP的客户端client,然后配置了它的一些参数,比如拦截器、超时时间 。我们通过一个统一的对象,调用一个接口或方法,就能完成我们的需求,而其内部的各种复杂对象的调用和跳转都不需要我们关心,从而降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口 。
(3)Request:建造者模式
val request: Request = Request.Builder().url(url).build()//Request.ktopen class Builder {internal var url: HttpUrl? = nullinternal var method: Stringinternal var headers: Headers.Builderinternal var body: RequestBody? = nullconstructor() {this.method = "GET"this.headers = Headers.Builder()}open fun build(): Request {return Request(checkNotNull(url) { "url == null" },method,headers.build(),body,tags.toImmutableMap())}}从Request的生成代码中可以看到,用到了其内部类Builder,然后通过Builder类组装出了一个完整的有着各种参数的Request类 。
我们可以通过Builder,构建不同的Request请求,只需要传入不同的请求地址url,请求方法method,头部信息headers,请求体body即可 。扩展:最全的java面试题库
(4)享元模式
通过线程池、连接池共享对象
(5)工厂模式
通过OkHttpClient生产出产品RealCall
四、Forest使用4.1 Forest基础4.1.1 配置层级
  • 全局配置:Application.yml / application.properties配置(spring、Spring Boot项目)以及通过ForestConfiguration对象(普通Java项目)设置
  • 接口配置
  • 请求配置

Forest,这款轻量级 HTTP 客户端 API 框架很强

文章插图
 
Forest 的配置层级:
  • 全局配置:针对全局所有请求,作用域最大,配置读取的优先级最小 。
  • 接口配置:作用域为某一个interface中定义的请求,读取的优先级最小 。可以通过在interface上修饰@BaseRequest注解进行配置 。
  • 请求配置:作用域为某一个具体的请求,读取的优先级最高 。可以在接口的方法上修饰@Request注解进行 HTTP 信息配置的定义 。
4.1.2 全局基本配置下面以Spring Boot项目为例:
在application.yaml / application.properties中配置的 HTTP 基本参数


推荐阅读