最近在学习的时候看到很多文章说到post和get区别的时候会提到有一个:post请求的时候会发送两条请求(分别为head和body),get请求只会发送一条???
但是真的是这样吗?
看了https://github.com/WangXiZhu/fe-storage/issues/31的文章,我发现并不是如此
$.ajax({
url: "https://randomuser.me/api/?results=10",
type: 'get',
headers: {
"Access-Control-Allow-Origin":"*"
},
success: function(data){
console.log(data)
},
error: function(){}
});
打开chrome的检查发现发送了两条请求记录,一条为options,另一个为get的正常请求
将Ajax的type改为post方式进行发送,发现和get方式的结果是一样的,也是发送了两条请求记录
所以会发送两条请求记录和get/post方法没有什么关系,那导致这种现象的原因是什么呢?
options作用
http的options方法用于捕获目的资源所支持的通信选项,客户端可以对特定的URL使用options方法,也可以对整站(通过将URL设置为“*”)使用该方法。
Preflight request(预检请求)
一个cors预检请求是用于检查服务器是否支持cors即跨域资源共享。当有必要的时候,浏览器会自动发出一个预检请求。
为什么需要发送预检请求?
我们都知道浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求,像XMLHttpRequest和Fetch都遵循同源策略。
浏览器限制跨域请求一般有两种方式:
1 浏览器限制发起跨域请求
2 跨域请求可以正常发起,但是返回的结果被浏览器拦截了
一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。
什么情况下需要
- 使用了除get/post/head方法之外的Http方法,如:put\delete\connect\options
- 人为设置对cors安全的首部字段集合之外的其他首部字段