前面对Spring Web 的入口程序进行了分析,今天我们先简单介绍一下http协议以及里面的一些基本概念,然后重点看下每个概念在spring web中是怎么进行抽象的,最后考察一下它的设计。
HTTP协议的介绍
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP).在HTTP协议中包括以下几种对象:客户端请求,服务端响应、浏览器中的cookie,访问方法(GET、POST等),媒体类型(文本、文件等等),这些对象在Spring Web中都有对应的抽象,下面我们就来探究一下Spring Web的抽象方式。
Spring Web对http协议中基本概念的抽象
request和response的抽象
在Spring Web中,对request和response首先抽象出了HttpMessage接口,代表了两者的元数据,其实就是Header信息。
然后又抽象出了HttpInputMessage和HttpOutputMessage,分别代表了服务端和客户端要接收的信息和要输出的信息。HttpInputMessage在服务端就是请求的Body,在客户端就是响应的Body;HttpOutputMessage在服务端就是响应的Body,在客户端就是请求的Body。
可以看出,Spring Web将请求和响应都抽象成了信息(Message),所谓请求和响应其实都是客户端和服务端之间传输的信息,只不过对于客户端和服务端的输入和输出分别起了一个不同的名字而已,在客户端中,输出就叫请求,输入就叫响应,在服务端中,输出就叫响应,输入就叫请求。
这是我们要学习的地方,想想看,如果要我们来抽象这两者,会抽象成什么样呢?
我们在HttpOutputMessage和HttpInputMessage中只看到了Header信息和Body,其实对于request来说,是不完整的,所以在Spring Web中又抽象了一个接口 :HttpRequest,其中就包含了请求方法,请求的URI,由于HttpRequest的继承了HttpMessage,所以也包含了Header的信息,这里我们发现,HttpRequest没有包含Body信息,这是为什么呢?
我理解,无论是HttpMessage还是HttpRequest都是信息的元数据,只不过在HttpRequest里面又多出了URI等信息,而信息真正的内容是用HttpOutputMessage和HttpInputMessage这两个接口来代表的,即Body信息。
那为什么这么来设计呢?我认为原因就是要抓住共性,然后层层递进,使抽象层更“纯洁”。具体来说,无论是request和response的共性就是都有Header,它们的本质就是 "信息",所以都叫Message,然后最高层的抽象就只包含了Header,这就是抓住共性;然后再看HttpOutPutMessage和HttpInputMessage,它俩把信息补充的更加完整,加上了Body;最后HttpRequest终于把一个完整的request给抽象完成了,加上了URI等信息,这就是层层递进。
看到这里,我们说牛人就是牛人,就对这两个对象的抽象就够我们学习好一阵了!!!
未完待续。。。