抓包的时候,有时会看到浏览器发送了2次接口相同的请求,第一条是OPTIONS,不会返回任何数据,也就是response body 里面没有内容,调第二次相同的接口会有response body 里会显示实际请求的数据。
OPTIONS请求:
options请求的官方定义:OPTIONS方法是用于请求获得由Request-URI标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。
用白话说就是:在发生正式的请求之前,先进行一次预检请求。看服务端返回一些信息,浏览器拿到之后,看后台是否允许进行访问。
为什么会用到OPTIONS请求?
1、产生了复杂的请求
首先说下简单请求,复杂请求就是它的对立面。
(1 )get/post/head请求
(2 )content-type 为text/plain、multipart/form-data、application/x-www-form-urlencoded
eg: 如果是使用application/json做数据交互的话,那么就是为复杂请求,需要先发个options
2、跨域
什么是跨域?
概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。
eg:
URL | 是否跨域 | 说明 |
http://www.a.com/a.js http://www.a.com/b.js | 否 | 同一域名下 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 否 | 同一域名下不同文件夹 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 是 | 同一域名,不同端口 不允许 |
http://www.a.com/a.js https://www.a.com/b.js | 是 | 同一域名,不同协议 不允许 |
像如果协议、端口不同,就需要通过后台去解决。像springboot 或ssm项目都有不同的解决办法
总结:只要是带自定义header的跨域请求,在发送真实请求前都会先发送OPTIONS请求,浏览器根据OPTIONS请求返回的结果来决定是否继续发送真实的请求进行跨域资源访问。所以复杂请求肯定会两次请求服务端。