HTTP 预请求OPTIONS
在有很多情况下,当我们在 js 里面调用一次 AJAX 请求时,在浏览器那边却会查询到两次请求:
第一次的 Request Method 参数是 OPTIONS;
还有一次就是我们真正的请求,比如 GET 或是 POST 等请求方式。
查阅相关的资料之后发现,这是浏览器对复杂跨域请求的一种处理方式,在真正发送请求之前会先进行一次预请求,就是我们刚刚说到的参数为 OPTIONS 的第一次请求。它的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求。如果在 options 请求之后获取到的响应是拒绝性质的,例如 500 等http 状态,那么它就会停止第二次的真正请求的访问。
大致说明一下,有三种方式会导致这种现象:
- 请求的方法不是 GET / HEAD / POST
- POST 请求的
Content-Type
并非application/x-www-form-urlencoded
、multipart/form-data
, 或text/plain
- 请求设置了自定义的 header 字段,比如我的我的
Content-Type
设置为application/json;charset=utf-8
并且自定义了 header 选项导致了这种情况。