Java Web学习(四)http协议
文章更新时间:2020/07/24
一、概念
定义
HTTP:超文本传输协议,是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议:用于定义客户端与web服务器通迅的格式。
版本
通讯中真正使用的http协议一般有两种:
- HTTP1.0
- HTTP1.1
客户端若需要向服务端发送请求,首先要建立TCP【控制传输协议】连接,也就是我们常说的“三次握手,四次挥手”,这个我们后续再详细了解
HTTP1.0与HTTP1.1的异同
共同点:请求和响应是成对出现的,客户端的一次请求一定会对应服务端的一次响应
不同点:
HTTP1.0
- 非持久连接,一次TCP连接只能进行一次请求与响应。
- 一次请求与响应对应一个TCP连接。
- 客户端只有接收到服务端对上一次请求的响应后,客户端才可发出第二次请求。
- 不支持对虚拟主机的访问。【请求头没有HOST属性】
- 客户端接收到响应后,马上发送关闭TCP连接的请求,服务端关闭连接。
HTTP1.1
- 持久连接,在一个TCP连接上可以传送多个请求和响应。
- 一般情况下,一个页面中的请求与响应对应一个TCP链接。
- 客户端不用等待上一次请求的结果返回,就可以发出下一次请求。
- 支持虚拟主机的访问。【请求头有HOST属性】
- 客户端接收到对最后一次请求的响应后,马上发送关闭TCP连接的请求,服务端关闭连接。
二、HTTP请求
定义
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。
结构
一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、空白行、以及请求正文
请求行
请求方式:GET(默认)、POST、HEAD、OPTIONS、DELETE、TRACE、PUT
GET(默认):多个数据之间以&进行分隔,数据容量通常不能超过1K。例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
POST:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。
消息头
- accept : 支持的数据类型
- Accept-Charset : 支持哪种字符集
- Accept-Encoding :支持的压缩格式
- Accept-Language :支持的语言环境
- Host :想访问哪台主机
- If-Modified-Since : 缓存数据的时间
- Referer :客户机是哪个页面来的 防盗链
- Connection :请求完后是断开链接还是何持链接
三、HTTP响应
定义
一个HTTP响应代表服务器向客户端回送的数据
结构
一个完整的HTTP请求包括如下内容:一个请求行、响应报头、空白行、以及响应正文
状态行
状态行格式: HTTP版本号 状态码 状态叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
响应头
- Location : 跳到哪里
- Server :服务器的型号
- Content-Encoding :数据的压缩格式
- Content-Length : 回送数据的长度
- Content-Language : 语言环境
- Content-Type :回送数据的类型
- Refresh :定时刷新
- Content-Disposition : 以下载方式打数据
- Transfer-Encoding :数据是以分块方式回送的
- Expires : 缓存存在时间,-1 控制浏览器不要缓存
- Cache-Control : 缓存控制(同时存在会覆盖Expires,"no-cache"为不缓存)
- Pragma : 缓存控制("no-cache"为不缓存)
四、GET请求和POST请求
GET请求
特点:客户端收到服务器端对GET请求回送的响应时,浏览器会自动缓存响应,当客户端再次进行相同的请求提交时,将直接读取本地浏览器缓存中的数据,提升用户体验,减轻服务器端的压力。
缺陷:
- 参数只能是字符串,而不能是其他类型
- 可以携带的数据量小
- 数据安全性低
- 参数作为URL的一部分,显示在地址栏,容易被拦截
POST请求
特点:
- 数据类型可以是任意形式,还可以是图片,音频,视频等。
- 请求可携带的数据量大
- 数据安全性高
- 响应结果不会缓存,每次请求都真正去请求服务器
Q:为什么GET请求的响应结果会被浏览器缓存,而POST请求的响应结果却不缓存呢?
A:主要是有两个原因:
- GET请求一般是向服务端查询或下载相关资源,多次请求结果应该是要保证一致的,所以设计为缓存的方式,减少了客户端和服务端交互的次数;而POST请求一般是用户要提交资源信息,所以对于响应结果每次都是独立的,也就不需要缓存了。
- GET请求对于请求因为其请求体为空,参数都丢到URL上了,对于请求是否相同容易比较,所以设计缓存机制;而POST请求因为请求参数类型太多,请求体比较复杂,不好比较请求是否相同,所以也就不设计缓存机制了
五、请求方式的选择
我们先简单了解一下,现在常用的请求类型有哪几种:
一般来说我们大部分请求都是使用GET方式来进行发送的,那么什么时候选用POST方式做请求发送比较合适呢?一般出现以下几种情况时,我们选用POST方式来发送请求:
- 请求携带参数的类型不是字符串
- 请求携带的参数数据量很大
- 请求携带的参数数据敏感性较高,安全性要求较高