浏览器为什么阻止请求?
网页遵守同源策略。跨域 fetch 请求需要目标服务通过 CORS 响应头授权。某些方法或请求头会让浏览器先发送 OPTIONS 预检;若预检失败,正式请求可能根本不会发出。
cURL 有什么不同?
cURL 不受浏览器 CORS 规则约束。终端命令成功,只说明该机器可以访问接口,不能证明网页能读取响应。浏览器还控制 Host、Cookie 等请求头;HTTPS 页面请求不安全的 HTTP 地址也可能被阻止。
如何排查?
在浏览器网络面板检查预检请求、目标 Origin 和响应头。核对 Access-Control-Allow-Origin 以及允许的方法和请求头是否匹配。不要把 fetch 的 no-cors 当作绕过方案:它会得到不可读取状态、请求头和正文的不透明响应。接口无法开启 CORS 时,可用可信的本地客户端或有完善防护的转发服务。