说一说http
说在前头:学习HTTP主要就是学习请求和响应数据的具体格式内容。 理论上
HTTP:超文本传输协议,定义了浏览器(万维网客户进程)怎样想万维网服务器请求万维网文档,以及怎样把文档传送给浏览器。 从层次的角度来看:HTTP是面向事务的应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式和规则(别想复杂了,就是一套规范!!),是万维网上能够可靠的交换文件的重要基础。(万物皆文件~)
(一个丑陋的图)
HTTP的操作过程 以用户单击鼠标后发生的事件为例:(访问www.baidu.com/index.html) 1)浏览器分析链接指向页面的URL(http://www.baidu.com/index.html); 2) 浏览器向DNS请求解析www.baidu.com的IP地址; 3) DNS解析出百度服务器的IP地址; 4)浏览器与该服务器建立TCP连接(默认端口80); 5)浏览器发出HTTP请求:GET/chn/index.html; 6)服务器通过HTTP响应把文件index.html发送给浏览器; 7)释放TCP连接; 8)浏览器解释文件index.html,并将web页面显示给用户;
HTTP协议特点
HTTP协议有它自己的一些特点,分别是:
-
基于TCP协议: 面向连接,安全 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在数据传输方面相比于UDP更安全。 -
基于请求-响应模型的:一次请求对应一次响应 请求和响应是一一对应关系(TCP协议的特性) -
HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的。 ( 无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。) 请求之间无法共享数据,这一特性对网络开发来说十分的不便捷,比如:某次响应中在购物车里已经购买了商品A,但是订单表中却没有相应的数据,这不是很死亡吗?! 但具体使用的时候,我们发现这些功能是可以正常展示数据的,原因是Java中提出了使用会话技术(Cookie、Session) 技术。 HTTP的无状态特性大大简化了服务器的设计,是服务器更容易支持 大量并发的HTTP请求。 通常使用cookie+database的方式来跟踪用户的活动。
Cookie的工作原理: 1. 当用户浏览某个使用Cookie的网站时,该网站服务器就为用户产生一个唯一的标识码,如“123456”; 2. 接着在给用户的响应报文中添加一个Set-cookie的首部行“Set-cookie:123456”。 3. 当用户收到响应后,就在他管理的特定Cookie文件中添加这个服务器的主机名和Cookie标识码; 4. 当用户继续浏览这个网站时,就会取出这个网站的标识码,并放入请求报文的Cookie首部行"Cookie:123456"; 5. 服务器就能根据请求报文中的Cookie识别码就能从数据库中查询到该用户的活动记录,进而进行一些个性化的工作; (cookie码就像商场的会员号,第一次去就办卡发号,之后每次按卡进行业务办理)
HTTP的连接:也即讨论TCP的连接问题【考研爱考】
一、 持久连接(HTTP1.1)
1. 非流水线式 2. 流水线式
二、非持久连接
web应用上
图片直接放进来有些模糊《捂脸》
请求数据总共分为三部分内容,分别是 [ 请求行、请求头、请求体 ]
- 请求行: HTTP请求中的第一行数据,请求行包含三块内容,分别是:
- GET[请求方式]
请求方式有七种,最常用的是GET和POST - [请求URL路径]
- HTTP/1.1[HTTP协议及版本]
-
请求头: 第二行开始,格式为key: value形式 请求头中会包含若干个属性,常见的HTTP请求头有: Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
这些数据有什么用处?
举例说明: 服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求,比如:
- 不同浏览器解析HTML和CSS标签的结果会有不一致,所以就会导致相同的代码在不同的浏览器会出现不同的效果
- 服务端根据客户端请求头中的数据获取到客户端的浏览器类型,就可以根据不同的浏览器设置不同的代码来达到一致的效果
- 解决浏览器兼容问题
*
请求体: POST请求的最后一部分,存储请求参数
- GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
- GET请求请求参数大小有限制,POST没有
响应数据格式
格式介绍
响应数据总共分为三部分内容,分别是响应行、响应头、响应体
-
响应行:响应数据的第一行,响应行包含三块内容,分别是 :HTTP协议及版本、响应状态码、状态码的描述 -
响应头:第二行开始,格式为key:value形式 响应头中会包含若干个属性,常见的HTTP响应头有: Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
-
响应体: 最后一部分。存放响应数据
2.3.2 响应状态码
最常用的三个:
- 200 ok 客户端请求成功
- 404 Not Found 请求资源不存在
- 500 Internal Server Error 服务端发生不可预期的错误
后话:Web服务器(如tomcat)是一个应用程序(软件),对HTTP协议的操作进行了封装,使得程序员不必直接对协议进行操作。
|