整理一下HTTP的请求方法、GET/POST方法的区别、HTTP状态码、跨域解决方法,最近面试也被问到这些问题。

一、HTTP的请求方法

GET: 通常是用来获取资源
POST: 提交数据
PUT: 修改数据
DELETE: 删除资源
HEAD: 获取资源的元信息

二、GET和POST请求的区别?

从字面意思来讲,GET就是拿、获得,POST就是给、邮寄。

1、缓存角度: GET请求会被浏览器主动缓存下来,留下历史记录,而POST默认不会;

2、编码角度: GET只能进行URL编码,只能接受ASCII字符,而POST没有限制;

3、参数角度: GET一般将参数放在URL中,存在安全问题,POST放在请求体中,适合传输敏感信息

4、幂等性角度: GET是幂等,POST则不是。(幂等表示执行相同的操作,结果也是相同的)

5、TCP角度:GET会将请求报文一次性发出去,而POST会分为2个TCP数据包,先发header部分,如果服务器响应100,再发body部分。(Firefox浏览器的POST请求只会发一个TCP包)。

三、HTTP状态码

1XX: 协议处理的中间状态,还需要后续操作
2XX: 成功状态
3XX: 重定向状态,资源位置发生变动,需要重新请求
4XX: 请求报文有误
5XX: 服务端发生错误

通常在开发过程中,常用到的状态码包括:
200:这个最常见,成功的状态码,通常在响应体中放有数据
204:与200的区别就在于响应头后没有body数据
206:表示部分内容,这个状态码在断点续传中可以看到(响应头字段为:Content-Range)

301: 永久重定向
302: 临时重定向
304: 协商缓存命中时返回这个304状态码

403: 服务器禁止访问
404: 资源未找到,在服务器上未找到相应的资源

500: 服务器出错了,一般将报错信息发送给后端,后端同学来检查

四、HTTP、HTTP/2特点

1、http特点

1、灵活可拓展。语义自由,只规定了基本格式;传输形式多样性,可传输文本、图片、视频等任意数据。

2、可靠传输。基于TCP/IP,继承了TCP特性。

3、请求-应答。一发一收、有来有回

4、无状态。每次的http请求都输独立、无关的,默认不需要保留状态信息。

2、http缺点

1、无状态。区分场景,无状态是优点也是缺点,例如长链接中,无状态就是缺点;如果就是获取一些数据,不需要保存连接上下文信息,无状态反而减少了网络开销,http成了优点。

2、明文传输:协议里的头部报文不使用二进制数据,而是文本形式。调试便利的同时,http报文信息暴露给了外界,容易被外界攻击。

3、https/2的改进

1、头部压缩:针对头部字段,采用压缩算法

2、多路复用:解决http对头阻塞问题

3、设置优先级:二进制分帧

4、服务器推送:不再是被动的接受请求、响应请求,能新建stream给客户端发送信息。

5、安全性:

4、三次握手

三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。

第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。

第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

五、跨域及解决方式:

前后端分离的开发模式中,通常会遇到跨域问题,当一个ajax请求发出去了,服务器也响应了,但是前端拿不到响应数据,这主要是因为浏览器有一个同源策略。

1、浏览器的同源策略

浏览器遵循同源策略,即协议 + host主机 + port端口都相同时,视为同源,不存在跨域。
当浏览器发送Ajax请求时,只要当前的URL和目标URL不同源(协议、host、port有一个不相同,就是不同源),就存在跨域请求。

2、CROS:跨域资源共享

CORS是一个W3C标准,需要浏览器和服务器的共同支持。一般在服务端响应头返回Access-Control-Allow-Origin:* (也可以指定具体的源名)

options 预检请求

1
2
3
4
5
OPTIONS / HTTP/1.1
Origin: 当前地址
Host: xxx.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header

在预检请求的响应返回后,如果请求不满足响应头的条件,则触发XMLHttpRequest的onerror方法,当然后面真正的CORS请求也不会发出去了。

3、Nginx反向代理

Nginx是高性能的反向代理服务器

反向代理其实就是拿到客户端的请求,将请求转发给其他服务器,主要场景是维持服务器集群的负载均衡。即:反向代理帮其他的服务器拿到请求,然后选择一个合适的服务器,将请求转交给它。

例如:客户端域名:client.com 服务器域名:server.com,Nginx解决跨域的方法如下:

1
2
3
4
5
6
7
server {
listen 80;
server_name client.com;
location /api {
proxy_pass server.com;
}
}

客户端首先访问client.com/api(此时不存在跨域),Nginx服务器作为反向代理,将请求转发给sever.com,响应返回时又将响应给到客户端,完成整个跨域请求。

4、Jsonp

通过给script标签的src填上目标地址发送GET请求(只支持GET请求),实现跨域请求拿到相应数据。

5、websocket

websocket实现了客户端与服务端直接的持久连接,本质没有使用了 HTTP 的响应头, 因此也没有跨域的限制