HTTP 协议
-
HTTP 的请求协议
-
HTTP 的请求协议包括:4 部分
- 请求行
- 请求头
- 空白
- 请求体
-
HTTP 请求协议的具体报文:GET 请求
-
GET /servlet05/getServlet?username=lucy&userpwd=1111 HTTP/1.1 请求行 Host: localhost:8080 请求头 Connection: keep-alive sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 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 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: http://localhost:8080/servlet05/index.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 空白行 请求体
-
-
HTTP 请求协议的具体报文:POST 请求
-
POST /servlet05/postServlet HTTP/1.1 请求行 Host: localhost:8080 请求头 Connection: keep-alive Content-Length: 25 Cache-Control: max-age=0 sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 Origin: http://localhost:8080 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 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 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: http://localhost:8080/servlet05/index.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 空白行 username=lisi&userpwd=123 请求体
-
-
请求行
- 包括三部分
- 第一部分:请求方式
- get(常用的)
- post(常用的)
- delete
- put
- head
- options
- trace
- 第二部分:URI
- 什么是 URI?统一资源标识符。代表网络中某个资源的名字。但是通过URI是无法定位资源的。
- 什么是 URL?统一资源标识符。代表网络中某个资源,同时,通过URL是可以定位到该资源的。
- URI 和 URL 什么关系?
- URI 包括 URL。
- 第三部分:HTTP 协议版本号
- 第一部分:请求方式
- 包括三部分
-
请求头
-
空白行
- 空白行是用来区分请求头和请求体的。
-
请求体
- 向服务器发送的具体数据。
-
-
HTTP 的响应协议
-
HTTP 的响应协议包括:4 部分
- 状态行
- 响应头
- 空白行
- 响应体
-
HTTP 响应协议的具体报文
-
HTTP/1.1 200 OK 状态行 Cache-Control: private 响应头 Content-Type: text/html; Charset=gb2312 Content-Encoding: gzip Vary: Accept-Encoding Server: Microsoft-IIS/10.0 X-Powered-By: ASP.NET Date: Tue, 28 Feb 2023 00:57:43 GMT Content-Length: 17443 空白行 <!DOCTYPE html> 响应体 <html> <title>爱收集资源网</title> </html>
-
-
状态行
- 三部分组成
- 第一部分:协议版本号
- HTTP/1.1
- 第二部分:状态码
- 200
- 第三部分:状态的描述信息
- OK
- 第一部分:协议版本号
- 三部分组成
-
响应头
-
空白行
- 空白行是用来区分响应头和响应体的。
-
响应体
- 响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染,解释并执行,最终展示出效果。
-
-
怎么向服务器发送 GET 请求,怎么向服务器发送 POST 请求?
- 到目前为止,只有一种情况可以发送 POST 请求:使用 form 表单,并且 form 标签中的 method 属性值为:method=“post”。
- 其他所有情况一律都是 get 请求:
- 在浏览器地址栏上直接输入 URL,敲回车,属于 get 请求。
- 在浏览器上直接点击超链接,属于 get 请求。
- 使用 form 表单提交数据时,form 标签中没有写 method 属性,默认就是 get
- 或者使用 form 的时候,form 标签中 method 属性值为:method=“get”
- …
-
GET 和 POST 有什么区别?
- get 请求发送数据的时候,数据会挂在 URI 的后面,并且在 URI 后面添加了一个 ?,? 后面是数据。这样会导致发送的数据回显在浏览器的地址栏上。
- post 请求发送数据的时候,在请求体当中发送数据,不会导致发送的数据回显在浏览器的地址栏上。
- get 请求只能发送普通字符串。并且发送的字符串长度有限制,不同的浏览器限制不同。这个没有明确的规范。
- get 请求无法发送大数据量。
- post 请求可以发送任何类型的数据。
- post 请求可以发送大数据量,理论上没有长度限制。
- get 请求在 W3C 中是这样说的:get 请求比较适合从服务器端获取数据。
- post 请求在 W3C 中是这样说的:post 请求比较适合向服务器端传送数据。
- get 请求是安全的。get 请求是绝对安全的。为什么?因为 get 请求只是为了从服务器上获取数据。不会对服务器造成威胁。(get 本身是安全的,你不要用错了。用错了之后又冤枉人家 get 不安全,你这样不好(太坏了),那是你自己的问题,不是 get请求的问题。)
- post 请求是危险的。为什么?因为 post 请求是向服务器提交数据,如果这些数据通过后门的方式进入到服务器当中,服务器是很危险的。另外 post 是为了提交数据,所以一般情况下拦截请求的时候,大部分会选择拦截(监听)post 请求。
- get 请求支持缓存。
- https://n.sinaimg.cn/finance/590/w240h350/20211101/b40c-b425eb67cabc342ff5b9dc018b4b00cc.jpg
- 任何一个 get 请求最终的“响应结果”都会被浏览器缓存起来。在浏览器缓存当中:
- 一个 get 请求的路径对应 一个资源。
- 一个 get请求的路径对应 一个资源。
- 一个 get 请求的路径对应 一个资源。
- …
- 实际上,你只要发送 get 请求,浏览器做的第一件事都是先从本地浏览器缓存中找,找不到的时候才会去服务器上获取。这种缓存机制目的是为了提高用户的体验。
- 有没有这样一个需求:我们不希望 get 请求走缓存,怎么办?怎么避免走缓存?我希望每一次这个 get 请求都去服务器上找资源,我不想从本地浏览器的缓存中取。
- 只要每一次 get 请求的请求路径不同即可。
- https://n.sinaimg.cn/finance/590/w240h350/20211101/7cabc342ff5b9dc018b4b00cc.jpg?t=789789787897898
- https://n.sinaimg.cn/finance/590/w240h350/20211101/7cabc342ff5b9dc018b4b00cc.jpg?t=789789787897899
- https://n.sinaimg.cn/finance/590/w240h350/20211101/7cabc342ff5b9dc018b4b00cc.jpg?t=系统毫秒数
- 怎么解决?可以在路径的后面添加一个每时每刻都在变化的“时间戳”,这样,每一次的请求路径都不一样,浏览器就不走缓存了。
- post 请求不支持缓存。(POST 是用来修改服务器端的资源的。)
- post 请求之后,服务器“响应的结果”不会被浏览器缓存起来。因为这个缓存没有意义。
-
GET 和 POST 如何选择?什么时候使用 GET?什么时候使用 POST?
- 怎么选择 GET 请求和 POST 请求呢?衡量标准是什么呢?你这个请求是想获取服务器端的数据,还是想向服务器发送数据。如果你是想从服务器上获取资源,建议使用 GET 请求,如果你这个请求是为了向服务器提交数据,建议使用 POST 请求。
- 大部分的 form 表单提交,都是 post 方式,因为 form 表单中要填写大量的数据,这些数据是收集用户的信息,一般是需要传给服务器,服务器将这些数据保存/修改等。
- 如果表单中有敏感信息,还是建议适用 post 请求,因为 get 请求会回显敏感信息到浏览器地址栏上。(例如:密码信息)
- 做文件上传,一定是 post 请求。要传的数据不是普通文本。
- 其他情况都可以使用 get 请求。
-
不管你是 get 请求还是 post 请求,发送的请求数据格式是完全相同的,只不过位置不同,格式都是统一的。
- 格式 name=value&name=value