这一篇我们接着上一篇,理解一下Spring-Web对HTTP中的客户端是怎么抽象的。
客户端请求的抽象
所谓客户端的请求,其实是指在客户端准备要发给服务端的请求,所以本质上客户端的请求和服务端的请求是一个东西,但是角度不同,那相应关心的内容也有所不同,包括抽象也不同。
首先客户端的请求被抽象为了org.springframework.http.client.ClientHttpRequest接口,这个接口继承了HttpRequest和HttpOutPutMessage两个接口,和服务端的请求对应,在客户端请求是作为输出信息的,所以才继承了HttpOutPutMessage接口。
另外,和服务端的请求不同,服务端在抽象请求时,是关注请求的一些管理控制数据,比如认证信息principal等,而在客户端中,由于是要发给客户端,所以只关心执行发送请求的动作,所以只有一个excute方法,表示要发送请求。但这里要注意的是,Spring-Web还为我们准备了创建请求的工厂方法,方便我们对请求的创建。
对请求工厂的抽象是org.springframework.http.client.ClientHttpRequestFactory接口,只有createRequest一个方法。
最后,Spring-Web中还提供了拦截器机制,可以在请求发出前以及服务端返回的响应后,分别对请求和响应进行拦截处理,具体的行为包括考察这个请求本身以及请求body中的数据,或者过滤HTTP参数,或者修改请求body等等;在拦截器机制中Spring-Web还提供了请求执行的上下文,使我们执行拦截器链成为可能,即ClientHttpRequestExecution接口代表了客户端请求的执行上下文。
客户端响应的抽象
客户端的响应就是服务端返回的响应,在客户端看来,服务端的响是输入信息,所以ClientHttpResponse接口继承了HttpInputMessage接口,并且还继承了Closeable接口用以释放资源。
客户端对于响应的抽象,Spring-Web中只将响应状态抽象出来,并没有对响应的数据进行相关的约束,Spring-Web应该是认为对于数据处理应该交由更高层去处理,这里只关心响应状态。
总结
Spring-Web中对于Http的客户端的抽象,核心的接口包括:ClientHttpRequest、ClientHttpResponse、ClientHttpRequestFactory,另外又提供了拦截器机制的抽象:ClientHttpRequestInterceptor和ClientHttpRequestExecution,基于以上的抽象,Spring-Web提供了多种方式的实现,包括基于Apache Http组件的实现、基于OKhttp框架的实现和基于JDK的实现等等。
思考点
1、对于请求的创建,这里很好的体现了工厂模式的使用场景,就是对复杂对象的创建提供工厂方法。
2、对于请求和响应,通过一个拦截器机制,可以实现多层次的处理。