在有很多情况下,当我们在 js 里面调用一次 AJAX 请求时,在浏览器那边却会查询到两次请求:

第一次的 Request Method 参数是 OPTIONS;

还有一次就是我们真正的请求,比如 GET 或是 POST 等请求方式。

查阅相关的资料之后发现,这是浏览器对复杂跨域请求的一种处理方式,在真正发送请求之前会先进行一次预请求,就是我们刚刚说到的参数为 OPTIONS 的第一次请求。它的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求。如果在 options 请求之后获取到的响应是拒绝性质的,例如 500 等http 状态,那么它就会停止第二次的真正请求的访问。

大致说明一下,有三种方式会导致这种现象:

  1. 请求的方法不是 GET / HEAD / POST
  2. POST 请求的 Content-Type 并非 application/x-www-form-urlencodedmultipart/form-data, 或text/plain
  3. 请求设置了自定义的 header 字段,比如我的我的 Content-Type 设置为 application/json;charset=utf-8 并且自定义了 header 选项导致了这种情况。

标签: ajax, http