为啥 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 发送的主要内容,如果未能解决你的问题,请参考以下文章
为啥在我的 Angular 2 应用程序中发送 OPTIONS 请求而不是 PUT? [复制]