一、HTTP协议
HTTP协议有3个特征:持久连接、管道化以及无状态。
- 持久连接:在HTTP的早期版本中,一次HTTP通信完成后就会断开连接,下一次再重新建立连接。在请求资源不多的情况下时,并不会有什么影响。但随着HTTP的普及,请求的资源会越来越大,例如一个HTML文件中可能会包含多个CSS文件、JS文件等。如果还是这样操作,势必会造成巨大的通信开销。因此,在HTTP1.1版本中提出了持久连接,只要通信两端的任一一端没有明确提出断开,就保持连接状态,以便下一次通信复用该连接,避免了重复建立和断开连接所造成的开销,加速了页面呈现。
- 管道化:管道化是建立在持久连接上的进一步性能优化。过去,请求必须按照先进先出的队列顺序,也就是说发送请求后,要等待并接收到响应,才能继续下一个请求。启用管道化后,就会将队列顺序迁移到服务器,这样就能同时发送多个请求,服务器再按顺序一个接一个地响应。
- 状态管理:HTTP是一种无状态协议,请求和响应一一对应,不会再出现两个请求复用一个响应的情况。
在某些业务场景下,需要请求有状态,例如后台登陆。成功登录后就得保存登录状态,否则每次跳转进入其他页面都会要求重新登录。为了能管理状态,引入了cookie技术,cookie技术能让请求和响应的报文都附加cookie信息,客户端将cookie值发送出去,服务端接收并处理这个值,最终就能得到客户端的状态信息。
二、HTTP报文
HTTP报文就是HTTP协议通信的内容,是一种简单的格式化数据块,由语义的纯文本组成。
- 报文语法:请求报文和响应报文。请求报文由5部分组成:请求方法、请求URL、HTTP协议版本、可选的请求首部和内容。
<Method><Request URL><Version> <Headers> <Body>
响应报文也由5部分组成:HTTP协议版本、状态码、原因短语、可选的响应首部和内容。
<Version><Status Code><Reason Phrase> <Headers> <Body>
2.请求方法:HTTP通过请求方法说明请求目的,期望服务器执行某个操作。在可用的请求方法中,GET和POST是最常见的,而PUT和DELETE需要额外的安全机制保航才可以使用,提升了使用门槛。
方法 | 功能 |
GET | 获取数据 |
POST | 提交数据 |
PUT | 上传文件 |
DELETE | 删除文件 |
HEAD | 获取了内容以外的资源信息 |
3.状态码
状态码 | 类别 | 原因短语 |
1XX | 信息 | 请求已被接收,正在处理中 |
2XX | 成功 | 请求处理成功 |
3XX | 重定向 | 客户端需要附加操作才能完成请求 |
4XX | 客户端错误 | 客户端发起的请求服务器无法处理 |
5XX | 服务端错误 | 服务器在处理请求时发生错误或异常 |
三、HTTP首部
HTTP首部提供的信息能让客户端和服务器执行指定的操作,例如客户端发出的请求中带有可接受的内容类型,服务器就知道该返回什么样的内容。首部有5种类型:通用首部、请求首部、响应首部、实体首部和扩展首部。
1、通用首部:通用首部既可以存在于请求中,也可以存在于响应中。
首部 | 描述 |
Connection | 管理持久连接 |
Date | 报文的创建日期,HTTP协议使用了特殊的日期格式 |
Transfer-Encoding | 传输报文主体时的编码方式,例如分块传输编码 |
2、请求首部:请求首部只存在于请求报文中,提供客户端的信息以及对服务器的要求。
首部 | 描述 |
Accept | 可接受的MIME类型 |
Accept-Charset | 可接受的字符集 |
Accept-Encoding | 可接受的编码格式,服务器按指定的编码格式压缩数据 |
Accept-Language | 可接受的语言种类 |
Host | 服务器域名和端口 |
Referer | 上一个页面地址 |
User-Agent | 用户代理信息,例如操作系统、浏览器名称和版本等 |
3、响应首部:响应首部只存在于响应报文中,提供服务器的信息以及对客户端的要求。
首部 | 描述 |
Accept-Ranges | 服务器接受的范围类型 |
Server | 服务器软件的名称和版本 |
Age | 响应存在时间,单位为秒,这个首部可能由代理发出 |
4、实体首部:请求和响应都可能包含实体首部,实体首部提供了大量的实体信息。
首部 | 描述 |
Content-Encoding | 内容编码格式,告知客户端用这个编码格式解压 |
Content-Language | 内容语言 |
Content-Length | 内容尺寸,单位是字节 |
Content-Type | 内容是MIME类型 |
常见笔试题:GET和POST的区别是什么?
- 语义不同,GET是获取数据,POST是提交数据。
- HTTP协议规定GET比POST安全,因为GET只做读取,不会改变服务器中的数据,但这只是规范,并不能保证该方法实现也是安全的。
- GET请求会把附加参数带在URL上,而POST请求会把提交数据放在报文内。在浏览器中,URL长度会被限制,所以GET请求能传递的数据有限,但是HTTP协议其实并没有对其做限制,都是浏览器在控制。
- HTTP协议规定GET是幂等的,而POST不是,所谓幂等是指多次请求返回相同的结果。实际情况中没有这莫严格,当GET请求动态数据时,每次的结果会可能不同。