调用API出现Preflight响应失败错误,是否与代码相关?
错误含义
这是浏览器跨域资源共享(CORS)校验失败报错:
- 浏览器发起跨域非简单请求前,会自动发送
OPTIONS类型的预检请求,确认目标服务器是否允许当前站点的域名、请求方法、请求头访问对应接口 - 你收到的报错说明该预检请求未通过校验,浏览器直接拦截了后续正式的API请求,没有实际发送到IMDb接口
原因判断
你的代码本身逻辑没有问题,之前已正常运行多日即可证明,绝大多数场景下是服务端侧变更导致,少数为配置变更引发:
大概率非代码原因
- IMDb官方API的CORS访问策略发生变更,不再允许你当前站点的域名跨域调用,或是取消了公开跨域访问的配置
- 你的API密钥权限被限制,或是触发了API调用频次阈值,服务端针对你的请求返回了不符合CORS要求的响应头
- 若在本地调试,检查本地服务的域名/端口是否和之前正常运行时不一致,不在服务端允许的CORS源列表中
小概率配置类原因
- 检查你传入
getAPI函数的settings参数是否有过修改:比如新增自定义请求头、修改请求方法、新增credentials配置,这类改动会让原本的简单请求变为需要预检的非简单请求,触发CORS校验 - 检查请求URL是否有拼接错误,若请求到不存在的接口路径,服务端返回404/403时可能不会携带正确的CORS响应头,也会触发预检失败
临时解决方案
如果需要快速恢复使用,可以通过自己的后端服务代理转发该API请求,绕开浏览器的CORS限制。
内容的提问来源于stack exchange,提问作者Efe FRK
相关产品推荐
相关产品推荐

