为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送

Posted

技术标签:

【中文标题】为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送【英文标题】:Why does Fetch API Send the first PUT request as OPTIONS为什么 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送 【发布时间】:2017-07-07 18:03:20 【问题描述】:

我正在尝试使用原版 Fetch API 发出 cors PUT 请求

当我单击按钮发送 PUT 请求时,第一个请求的方法是OPTIONS。只有当我再次单击按钮时,请求上的方法才会更改为PUT。为什么?

我知道这是 CORS 预检的一部分,但有没有办法手动触发预检以便缓存 OPTIONS 响应?

这种行为是否表明某处的承诺失败?

【问题讨论】:

你读过规范吗? 是的,我已经阅读了规范。我想知道这是如何处理的——我是否需要检查已经发送的请求以查看它是否是 OPTIONS 请求然后再次发送? 规范不清楚吗? 不,不是。预检提取是手动进行还是自动进行? 您能否将您在 Question 中尝试的javascript 包括在内?如果根据可以收集的信息,预检请求是自动发生的,您可以手动执行请求。 fetch("url", method:"OPTIONS") .then(response => response.headers) .then(_headers => Array.from(_headers.entries(), h => console.log(h))).catch(err => console.error(err)),否则,从阅读规范,会发生网络错误。如果根据您的解释,规范不清楚,建议搜索类似问题,或在github.com/whatwg/fetch/issues 提交问题 【参考方案1】:

参见Fetch Standard,部分4.7. CORS-preflight fetch。

注意:这实际上是检查CORS protocol 是否被理解的用户代理实现。所谓CORS-preflight request。如果成功,它会填充 CORS-preflight cache 以最小化这些提取的数量。

在步骤 1 到 7;还有4.8. CORS-preflight cache。

【讨论】:

以上是关于为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送的主要内容,如果未能解决你的问题,请参考以下文章

浏览器取消 PUT 请求

使用 window.fetch api 的预检请求失败

为啥在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制]

为啥这个 jQuery AJAX PUT 可以在 Chrome 中工作,但不能在 FF 中工作

Javascript:获取 DELETE 和 PUT 请求

为啥 Fetch API 调用不返回响应标头?