1. Get 和 Post 请求的区别
- 应用场景: (GET 请求是一个幂等的请求)一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。(而 Post 不是一个幂等的请求)一般用于对服务器资源会产生影响的情景,比如注册用户这一类的操作。(幂等是指一个请求方法执行多次和仅执行一次的效果完全相同)
- 是否缓存: 因为两者应用场景不同,浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存。
- 传参方式不同: Get 通过查询字符串传参,Post 通过请求体传参。
- 安全性: Get 请求可以将请求的参数放入 url 中向服务器发送,这样的做法相对于 Post 请求来说是不太安全的,因为请求的 url 会被保留在历史记录中。
- 请求长度: 浏览器由于对 url 长度的限制,所以会影响 get 请求发送数据时的长度。这个限制是浏览器规定的,并不是 RFC 规定的。
- 参数类型: get参数只允许ASCII字符,post 的参数传递支持更多的数据类型(如文件、图片)。
2. Post 和 Put 请求的区别
PUT请求是向服务器端发送数据,从而修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。(可以理解为时更新数据)
POST请求是向服务器端发送数据,该请求会改变数据的种类等资源,它会创建新的内容。(可以理解为是创建数据)
为什么 Post 请求会发送两次请求?
- 第一次请求为
options
预检请求,状态码为204
- 询问服务器是否支持修改的请求头,如果服务器支持,则在第二次中发送真正的请求
- 检测服务器是否为同源请求,是否支持跨域
- 第二次请求为真正的
post
请求
3. 常见的 HTTP 请求头和响应头
HTTP Request Header
- Accept :浏览器能够处理的内容类型
- Accpet-Charset :浏览器能够显示的字符集
- Accept-Encoding :浏览器能够处理的压缩编码
- Accept-Language :浏览器当前设置的语言
- Connection :浏览器与服务器之间连接的类型
- Cookie :当前页面设置的任何 Cookie
- Host :发出请求的页面所在的域
- Referer :发出请求的页面的URL
- User-Agent :浏览器的用户代理字符串
HTTP Responses Header
- Date :表示消息发送的时间,时间的描述格式由 rfc822 定义
- server :服务器名称
- Connection :浏览器和服务器之间的连接类型
- Cache-Control :控制 HTTP 缓存
- content-type :表示后面的文档属于什么 MIME 类型
常见的 Content-Type
application/x-www-form-urlencorded
: 浏览器原生的 form 表单,如果不设置 enctype 属性,那么最终会以application/x-www-form-urlencorded
方式提交数据。该种方式提交的数据放在body
里面,数据按照key1=val1&key2=val2
的方式进行编码,key 和 val 都进行了 URL转码。multipart/form-data
: 该种方式也是常见的 Post 提交方式,通常表单上传文件时使用该方式。application/json
: 服务器消息主体是序列化后的 JSON 字符串text/xml
: 该种方式主要用来提交 XML 格式的数据
4. HTTP 状态码 304 是多好还是少好
服务器为了提高网站的访问速度,对之前访问的部分页面指定缓存机制,当客户端在次对这些页面进行请求,服务器会根据缓存内存判断页面与之前是否相同,若相同便直接返回 304 ,此时客户端调用缓存内容,不必进行二次下载
产生较多 304 状态码的原因:
- 页面的更新周期长或不更新
- 纯静态页面或强制生成静态 html
造成的问题
- 网站快照停止
- 收录减少
- 权重下降
5. 常见的 HTTP 请求方法
GET
: 向服务器获取数据POST
: 发送数据给服务器,通常会造成服务器资源的新增修改PUT
: 用于全量修改目标资源(看接口,也可以用于添加)PATCH
: 用于对资源的部分修改DELETE
: 用于删除指定资源HEAD
: 获取报文首部,与 get 相比,不返回报文主体部分;使用常见是比如下载一个大文件前,先获取其大小再决定是否要下载,以此可以节约宽带资源OPTIONS
: (浏览器自执行)询问支持的请求方法,用来跨域请求、预检请求、判断目标是否安全CONNECT
: 要求在与代理服务器通信时建立管道,使用管道进行TCP通信;(把服务器作为跳板,让服务器代替用户访问其他网页,之后把数据原原本本的返回给用户)TRACE
: 该方法会让服务器原样返回任意客户端请求的信息内容,主要用于测试和诊断
6. HTTP1.0 和 HTTP1.1 之间的区别
- 连接方面,http1.0 默认使用非持久连接,而 http1.1 默认使用持久连接。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接,以此来避免使用非持久连接时每次需要建立连接的时延。
- 资源请求方面,在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 缓存方面,在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- http1.1 中新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同网站。 http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。
7. HTTP和HTTPS协议的区别
- HTTPS 协议需要 CA证书,费用较高;HTTP 协议不需要
- HTTP 协议是超文本传输协议,信息是明文传输的;HTTPS 则具有安全性的 SSL加密传输协议
- 使用不同的连接方式,端口也不同,HTTP 协议是 80;HTTPS 协议是 443
- HTTP 协议连接很简单,是无状态的;HTTPS 协议是有 SSL 和 HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 更加安全
8. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
- 解析URL: 首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。
- 缓存判断: 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。
- DNS解析: 下一步首先需要获取的是输入的 URL 中的域名的 IP 地址,首先会判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。
- 获取MAC地址(选说) 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。
- TCP三次握手: ,确认客户端与服务器的接收与发送能力,下面是 TCP 建立连接的三次握手的过程,首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,确认连接请求,并且也向客户端发送一个随机序号。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。
- HTTPS握手(选说): 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。
- 发送HTTP请求 服务器处理请求,返回HTTP报文(响应)(文件)
- 页面渲染: 浏览器首先会根据 html 文件(响应) 建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。
- TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。
9. 与缓存相关的HTTP请求头有哪些
强缓存
- Expires
- Cache-Control
协商缓存
- Etag 、 If-None-Match
- Last-Mondified 、 If-Mondified-Since
强缓存 与 协商缓存
- 强缓存: 不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且size显示from disk cache或from memory cache两种(灰色表示缓存)。
- 协商缓存: 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
共同点:都是从客户端缓存中读取资源; 区别是强缓存不会发请求,协商缓存会发请求。
10. HTTP的keep-alive有什么作用?
http1.0 默认关闭,需要手动开启。http1.1 后默认开启
作用 : 使客户端到服务器端的链接持续有效(长连接),当出现对服务器的后续请求时, keep-alive 功能避免了建立或重新建立多次链接
使用方法 : 在请求头上加 Connection: keep-alive
优点 :
- 较少的CPU和内存的占用(因为要打开的连接数变少了,复用了连接)
- 减少了后续请求的延迟(无需再进行握手)
缺点 : 本来可以释放的资源仍旧被占用。有的请求已经结束了,但是还一直连接着。
解决方法 : 服务器设置过期时间和请求次数,超过这个时间或者次数就断掉连接。
11. axios 取消请求
js
const controller = new AbortController()
axios.get('/foo/bar', {
signal: controller.signal
}).then(res => { })
// 取消
controller.abort()