1.HTTP协议简介
HTTP协议是W3C指定的一种超文本传输协议,是一种通信协议,这种协议游走B(Browser)和S(Server)之间,B想S发送数据要遵循HTTP协议,S向B发数据同样需要遵循HTTP协议,这个S和B才能解耦合,即S不依赖于B,B也不依赖于S;
超文本:不是普通的文本,还包括声音、视频、图像等;
Http协议包括:
-
请求协议 浏览器向web服务器发送数据的时候,这个发送的数据需要遵循的一套标准,这套标准中规定了发送的数据的具体形式; 包括4部分:
- 请求行
- 包括三部分
- 请求方式(get/post/head/delete/put/options/trace)
- uri–统一资源标识符,代表网络中某个资源的名字,但是通过uri是无法定位资源的
- url–统一资源定位符,代表网络中某个资源,同时,通过url是可以定位到资源的
- url包括uri
- url:http://localhost:8080/Servlet02/getServlet
- uri:/Servlet02/getServlet
- 协议版本号
- 请求头
- 请求的主机
- 主机端口
- 浏览器信息
- 平台信息
- cookie信息
- 空白行
- 请求体
http请求协议具体报文 ? get请求 GET /Servlet02/getServlet? 请求行 username=%E5%95%8A%E5%AE%9E%E6%89%93%E5%AE%9E%E5%A4%A7&password=dsasdas HTTP/1.1
Accept: 请求头text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Cookie: _bl_uid=3zky1xteqzOvFF5F657LkOLcet59
Host: localhost:8080
Pragma: no-cache
Referer: http://localhost:8080/Servlet02/index.html
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
空白行
请求体
? post请求 POST /Servlet02/getServlet HTTP/1.1 请求行
Accept: 请求头text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 54
Content-Type: application/x-www-form-urlencoded
Cookie: _bl_uid=3zky1xteqzOvFF5F657LkOLcet59
Host: localhost:8080
Origin: http://localhost:8080
Pragma: no-cache
Referer: http://localhost:8080/Servlet02/index.html
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
空白行
username: 撒大大 请求体
password: sada sd
-
响应协议 we服务器向浏览器发送数据的时候,这个发送的数据需要遵循的一套标准,这套标准中规定了发送的数据的具体形式; 包括4部分:
- 状态行
- 三部分组成
- 协议版本号(http/1.1)
- 状态码(
- 200:请求成功
- 404:资源不存在,通常是因为路径写错了,或者路径写对了,但是服务器对应的资源没有请求成功,总之404是前端错误
- 405:前端发送的请求方式与后端对请求的处理方式不一致,比如前端是get请求,后端是post处理,或者前端是post请求,后端是get处理;
- 500:服务器端的程序出现了异常,一般是服务器端错误导致
- 以4开头的,一般是浏览器端的错误导致
- 以5开头的,一般是服务器端的错误导致
- 状态描述信息
- ok 表示正常成功结束
- not found 表示资源找不到
- 响应头
- 空白行
- 响应体
- 响应的正文,这些内容是一个长的字符串,被浏览器渲染并执行,最终展示出效果
http响应协议具体报文 HTTP/1.1 200 状态行
Content-Type: text/html;charset=utf8 响应头
Content-Length: 11
Date: Thu, 05 May 2022 11:10:59 GMT
Keep-Alive: timeout=20
Connection: keep-alive
空白行
get请求 响应体
2.GET与POST
get请求与post请求的区别
- get请求在请求行上发送数据,get请求发送数据的时候,数据会挂在uri的后面,并且在uri后面加一个?,?后面是数据,这样会导致发送的数据显示在浏览器上面
- post请求在请求体上发送数据,数据不会显示到浏览器地址栏上
- get与post请求发送数据的个数是相同的,都是key=value&key2=value2
- get请求只能发送普通的字符串,并且发送的字符串的长度有限制。不同的浏览器限制不同,没有明确规定,get请求无法发送大数据量
- post请求可以发送任何类型的数据,包括流媒体:图片、声音、视频等等,post请求可以发送大数据量,理论上没有长度限制
- get请求在W3C中是这样说的:get请求比较适合从服务器获取数据
- poset请求在W3C中是这样说的:post请求比较适合向服务器传送数据
- get请求是绝对安全的,因为get请求只是为了从服务器获取数据
- post请求是危险的,因为post请求是向服务器提交数据,如果这些数据通过后门的方式进入到服务器当中,服务器是很危险的,另外post是为了提交数据,所以一般情况下拦截请求的时候,大部分拦截(监听)post请求;
- get请求支持缓存,post请求不支持缓存,任何一个get请求最终的响应结果都会被浏览器缓存起来,在浏览器缓存当中,一个get请求对应一个资源,实际上,只要发送get请求,浏览器都会先从本地缓存中寻找这个资源,找不到再去服务器获取,这样做是为了提高用户的体验,post请求之后,服务器的响应结果不会被浏览器缓存起来,因为这个缓存没有意义;
- 只要每次的get请求路径不同,就可以避免浏览器去缓存中查找资源
- 大部分form表单提交都是post,因为form表单提交的数据比较多,并且数据不希望显示在浏览器地址栏上,如果提交的是流媒体文件,一定是post,因为get只能传字符串;
|