【HTTP】URL结构、HTTP请求和响应的报文格式、HTTP请求的方法、常见的状态码、GET和POST有什么区别、Cookie、Session等重点知识汇总
目录
URL格式
?:是用来分割URL的主体部分(通常是路径)和查询字符串(query string)查询字符串是一组键值对的参数
query string:是键值对的结构,&分割键值对,=分割键和值
HTTP请求和响应报文的字段?
Content-Type: 数据类型(text/html等)。
Content-Length: 正文的长度。
Host: 客户端告知服务器,所请求的资源是在哪个主机的哪个端口上。
User-Agent: 声明用户的操作系统和浏览器的版本信息。
Referer: 当前页面是哪个页面跳转过来的。
Location: 搭配3XX状态码使用,告诉客户端接下来要去哪里访问。
Cookie: 用于在客户端存储少量信息,通常用于实现会话(session)的功能。
Connection 字段 ---> 长连接
HTTP/1.1 版本的默认连接都是长连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive。
开启了 HTTP Keep-Alive 机制后, 连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接,一直持续到客户端或服务器端提出断开连接。
Content-Encoding 字段
Content-Encoding 字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
Content-Encoding: gzip
HTTP请求方法
GET:用于从服务器获取资源,通常是通过URL传递参数来请求资源。GET请求是幂等的,即多次请求相同资源不会产生不同的结果。
POST:用于向服务器提交数据,通常用于创建新资源或在服务器上执行某些操作。POST请求不幂等,多次提交相同的数据可能会产生不同的结果。
HEAD:类似于GET请求,但只返回资源的头部信息,不返回实际的数据。通常用于检查资源是否存在或获取资源的元数据。
PUT:用于更新或创建指定的资源,通常将请求的数据放在请求体中,以覆盖服务器上的现有资源或创建新资源。
DELETE:用于删除指定的资源。DELETE请求用于删除服务器上的资源。
OPTIONS:用于获取目标资源支持的通信选项。客户端可以使用OPTIONS请求来查询服务器支持的请求方法、头部信息等。
PATCH:用于部分更新资源,通常将请求的数据放在请求体中,只更新资源的一部分而不是整个资源。
TRACE:用于追踪请求在传输过程中的轨迹,通常用于诊断和调试。
CONNECT:通常用于建立与代理服务器的网络连接,以便进行加密通信(如HTTPS)或隧道传输。
常见的状态码
1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
- 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
- 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
- 「401 Unauthorized」:表示需要身份验证,客户端未提供有效的凭据。
- 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
- 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
- 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
- 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
GET 和 POST 的区别
RFC代表"Request for Comments",它是一种用于制定和描述互联网标准、协议和相关信息的文档系列。RFC文档是由互联网工程任务组和其他互联网相关组织发布的,用于记录互联网的技术规范和协议。
根据 RFC 规范,GET 的语义是从服务器获取指定的资源。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,以?分割URL和传输数据,参数之间以&相连
根据 RFC 规范,POST 的语义是根据请求负荷(报文body)对指定的资源做出处理(POST方法一般用于将数据上传给服务器)。POST 请求携带数据的位置一般是写在报文 body 中
先说明下安全和幂等的概念:
- 在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
- 所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。
如果从 RFC 规范定义的语义来看:
- GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求)
- POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求的数据做缓存。
上面是从 RFC 规范定义的语义来分析的。
但是实际过程中,开发者不一定会按照规范定义的语义来实现 GET 和 POST 方法。比如:
- 可以用 GET 方法实现新增或删除数据的请求,这样实现的 GET 方法自然就不是安全和幂等。
- 可以用 POST 方法实现查询数据的请求,这样实现的 POST 方法自然就是安全和幂等。
如果「安全」放入概念是指信息是否会被泄漏的话,虽然 POST 用 body 传输数据,而 GET 用 URL 传输,这样数据会在浏览器地址拦容易看到,但是并不能说 GET 不如 POST 安全的。
虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。
GET和POST没有本质区别,使用GET实现的场景基本上也可以使用POST,使用POST实现的场景基本上也可以使用GET
Cookie 和 Session
Cookie和Session是用于在Web应用中维护用户状态和跟踪用户会话的两种常见方式
Cookie
- cookie是请求头中的一个重要字段,在服务器返回的响应报文中,可以在响应header中包含一个或多个Set-Cookie这样的资源,浏览器看到这些Set-Cookie就会把这样的数据保存在浏览器本地。
- Cookie典型的应用场景,在客户端维持登陆状态。在某个网站上登陆成功之后,浏览器就会记住当前登录用户的身份信息,然后在接下来的访问网站的其他页面,服务器也能知道是谁在登录。
- Cookie是存储在客户端(通常是浏览器)中的小型文本文件(一般<=4KB)。服务器将Cookie发送给客户端并存储在客户端的本地文件中,以便在后续HTTP请求中将Cookie发送回服务器。
- Cookie通常用于存储少量简单的文本数据,例如用户偏好设置或用于跟踪用户的身份验证令牌。
Cookie不是缓存,是持久化存储数据的手段,浏览器自动帮你存储,这个存储是保存到硬盘上的;而缓存的数据不一定是持久化的(也可以在内存里缓存);缓存的数据是用来提高访问速度的!
- Cookie数据存储在客户端的浏览器中,因此可能容易受到客户端篡改或窃取的风险。
- 由于每个HTTP请求都会包含任何相关Cookie数据,因此可能会增加网络流量和加载时间。
Session
- 服务器同一时刻收到的请求有很多,服务器需要清楚的区分每个请求属于哪个客户端,就需要先在服务器这里记录每个用户的身份标识和所对应的用户信息。就有了session!sessionId是由服务器生成的一个唯一性字符串;
- Session数据通常存储在服务器上。服务器为每个客户端会话创建一个唯一的标识符(通常是会话ID,sessionID),并使用该标识符来跟踪和管理与特定用户相关的数据。
会话的本质就是一个哈希表,存储着一些键值对。其中key就是身份标识(sessionId),value就是用户信息(session)。
- Session用于存储更敏感和持久的数据,例如用户身份验证信息。Session通常用于存储更大、更复杂的数据,如用户登录状态、购物车内容等。
- Session数据存储在服务器上,客户端无法直接访问或修改Session数据,因此通常比Cookie更安全。但服务器端的安全性也非常重要,以防止会话劫持等攻击。
- Session数据存储在服务器上,不会在每个请求中传输,因此不会对网络性能产生太大影响。