Http协议详解以及GET和POST请求
文章目录
- 1.什么是协议
- 2.什么是HTTP协议?
- 3.GET和POST请求
- 3.1GET和POST请求有什么区别?
1.什么是协议
(1)协议实际上是某些人,或者某些组织提前定制好的一套规范,大家按照这个规范来,这样就可以做到沟通无障碍
(2)协议就是一套规范,就是一套标准。由其他人或者组织来负责制定的。
2.什么是HTTP协议?
(1)HTTP协议:是W3C制定的一种超文本传输协议
(2)W3C:
①万维网联盟组织
②负责指定标准的:比如 HTTP、HTML4.0、HTML5、XML、DOM等规范都是由W3C制定的
③万维网之父:蒂姆·伯纳斯·李
(3)什么是超文本?
①超文本说的就是:不是普通文本,比如流媒体:声音、视频、图片等。
②HTTP协议不但可以支持传送普通字符,还支持传递声音、视频、图片等媒体信息。
(4)这种协议游走在B和S之间。B向S发送数据要遵循HTTP协议,S向B发送数据同样需要遵循HTTP协议。这样B和S才能解耦合。
(5)什么是解耦合?
B不依赖S,S也不依赖B
(6)B/S表示:B/S结构的系统(浏览器访问WEB服务器的系统)
①浏览器 向 WEB服务器发送数据叫做:请求(request)
②WEB服务器 向 浏览器发送数据叫做:响应(response)
(7)HTTP协议包括
①请求协议:浏览器向WEB服务器发送数据的时候,这个发送的数据要遵循一套标准,这套标准中规定了发送数据的具体格式
②响应协议:WEB服务器向浏览器发送数据的时候,这个发送的数据要遵循一套标准,这套标准中规定了发送数据的具体格式
(8)HTTP协议就是提前制定好的一种消息模板
①不管你是哪个品牌的浏览器,都是这么发。
②不管你是哪个品牌的WEB服务器,都是这么发
③Firefox浏览器可以向Tomcat发送请求,也可以向Jetty服务器发送请求。浏览器不依赖于具体的服务器品牌
④WEB服务器也不依赖具体的浏览器品牌。可以是Firefox浏览器,也可以是Chrome浏览器。
(9)HTTP的请求协议(B -> S)包括4部分:请求行、请求头、空白行和请求体
- HTTP请求协议的具体报文:GET请求
GET /prod-api/mwms/aimsSupplierInfo/list HTTP/1.1 请求行
Host: localhost:9090 请求头
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: Admin-Token=eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6ImU4YTY3YjNlLTZmNmQtNGFmZi1iNzMyLTkyOTliYTllOTYwZCIsInVzZXJuYW1lIjoiYWRtaW4ifQ.suGno8RNhsMzAXj6dWMziyPtPcA9tYVeGswOD_QjU3D-BVZuTwVROf61RPDMEqxM43XLN3QL25JwbOJjmBULJQ; Admin-Expires-In=720;
Referer: http://localhost:9090/basic/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
空白行
请求体
- HTTP请求协议的具体报文:POST请求
POST /prod-api/location/inStorageFoldLine HTTP/1.1
Host: localhost:9090
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Length: 0
Cookie: Admin-Expires-In=720; storageType=3; Admin-Token=eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjE1NjI5ZGU3LTcyZjItNGEzMy05NDM2LThjNDMwNWZjNTdiNyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.Rn4KgtUZsMCtl0eaLu4hu3Za5kYcARRZp0JQI8iOWfs4lMQXMBNbVMbUztFW6u80vgUdJw__wy7EJprv64zT1Q;
Referer: http://localhost:9090/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
1)请求行包括三部分
-
请求方式:get、post、delete、put、head、options、trace
-
URI:
URI是统一资源标识符,代表网络中某个资源的名字,但是通过URI无法定位资源;URI例如:/servlet/index.html
与之对应的URL是统一资源定位符,代表网络中某个资源,通过URL是可以定位到该资源的。URL包括URI。
URL例如:http://localhost:8080/servlet/index.html -
HTTP协议版本号
2)请求头
- 请求的主机
- 请求的端口
- 浏览器信息
- 平台信息
- cookie等信息
- …
3)空白行:空白行是用来区分"请求头"和"请求体"的
4)请求体:向服务器发送的具体数据
(10)HTTP的响应协议(S -> B)包括4部分:
状态行、响应头、空白行、响应体;HTTP响应协议的具体报文示例如下:
HTTP/1.1 200 OK 状态行
Server: nginx/1.21.6 响应头
Date: Mon, 19 Jun 2023 08:53:27 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
空白行
{ 响应体
"total": 1,
"rows": [
{
"createBy": "admin",
"createTime": "2023-03-13 11:12:56",
"updateTime": "2023-03-13 11:12:56",
"id": 13,
"supplierCode": "S1",
},
],
"code": 200,
"msg": "查询成功"
}
1)状态行由三部分组成
- 第一部分:协议版本号(HTTP/1.1)
- 第二部分:状态码(HTTP协议中规定的响应状态号,不同的响应结果对应不同的号码)
①200 表示请求响应成功,正常结束
②404表示访问的资源不存在,通常是因为路径写错了,或者服务器中对应的资源没有启动成功 - 第三部分:状态的描述信息
①OK表示正常成功结束
②not found 表示资源找不到
2)响应头
- 响应的内容类型
- 响应的内容长度
- 响应的时间
- …
3)空白行
用来分割“响应头”和“响应体”的
4)响应体
响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染解释并执行,最终展示出效果
3.GET和POST请求
3.1GET和POST请求有什么区别?
(1)get请求发送数据的时候,数据会挂在URI的后面,并且在URI后面添加一个“?”,“?”后面是数据;这样会导致发送的数据会显示在浏
览器的地址栏上http://localhost:8080/servlet/?username=zs&passwd=123
(2)post发送数据的时候,在请求体当中发送,不会显示到浏览器的地址栏上(POST在“请求体”中发送数据)
(3)get请求只能发送普通的字符串,并且发送的字符串长度有限制,不同的浏览器限制不同,这个没有明确的规范
(4)get请求无法发送大数据量
(5)post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、图片
(6)post请求可以发送大数据量,理论上没有长度限制
(7)在W3C是这样说的,get请求比较适合从服务器端获取数据,post请求比较适合向服务器端传送数据
(8)get请求是安全的,因为get请求只是为了从服务器上获取数据,不会对服务器造成威胁;post请求是危险的,因为post请求是向服务器提交数据的,如果有危险数据通过后台的方式进入到服务器当中,对服务器是很危险的
(9)get请求支持缓存,一个get请求的路径对应一个资源。实际上,你只要发送get请求,浏览器做的第一件事就是先从本地浏览器缓存去找,找不到才会从服务器获取,这种缓存机制的目的是为了提高用户的体验。post请求不支持缓存,post请求之后,服务器“响应的结果”不会被浏览器缓存起来,因为这个缓存没有意义。比如银行的转账,成功与否的结果缓存起来没有任何意义。