You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JS调用URL提取参数遇No 'Access-Control-Allow-Origin'错误求助

解决AJAX跨域请求的CORS错误问题

首先,咱们来拆解你遇到的这个错误:No 'Access-Control-Allow-Origin' header is present on the requested resource——这是浏览器的同源策略在起作用。简单说,浏览器不允许网页从一个域名(这里你的页面是null,应该是本地打开的file://文件)去请求另一个域名的API,除非目标API服务器明确通过响应头允许这种跨域访问。

你直接在浏览器地址栏访问能成功,是因为地址栏的请求不受同源策略限制,而AJAX请求属于页面内的跨域请求,会被浏览器拦截。

下面给你几个可行的解决方案,按推荐优先级排序:

1. 修改API服务器的CORS配置(最优方案)

让提供这个/api/mail_ru/scan.json接口的后端开发者,在响应头里添加:

Access-Control-Allow-Origin: *

或者更安全地,指定允许访问的具体域名(比如你部署页面的域名):

Access-Control-Allow-Origin: https://your-domain.com

如果需要带自定义头或者凭证,还要额外配置Access-Control-Allow-MethodsAccess-Control-Allow-Headers等头。

2. 用本地代理转发请求(开发阶段常用)

如果你没法修改后端,可以在本地搭建一个代理服务器,把你的AJAX请求转发到目标API。比如用Node.js做一个简单的代理:

先安装依赖:

npm install express http-proxy-middleware

然后创建proxy.js

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();

app.use('/api', createProxyMiddleware({
  target: 'http://<Actual URL>', // 替换成目标API的域名
  changeOrigin: true,
}));

app.listen(3000, () => {
  console.log('Proxy server running on http://localhost:3000');
});

然后把你的AJAX请求URL改成:

url: 'http://localhost:3000/api/mail_ru/scan.json?api_key=SgJEE8ZMUmpJ66lLfKTjxpbcsdI3cIml&domain=<search URL>'

这样你的页面请求本地代理,代理再去请求目标API,就绕过了跨域限制。

3. 尝试使用JSONP(如果API支持)

如果目标API支持JSONP格式,你可以修改AJAX请求的dataTypejsonp

$.ajax({
  type: 'GET',
  url: 'http://<Actual URL>/api/mail_ru/scan.json?api_key=SgJEE8ZMUmpJ66lLfKTjxpbcsdI3cIml&domain=<search URL>',
  cache: false,
  dataType: 'jsonp', // 这里改成jsonp
  success: function(data) {
    var outputuid = data.uid;
    alert(outputuid);
  },
  error: function(data) {
    alert("Failed");
  },
});

但注意:JSONP只支持GET请求,而且需要API服务器能返回callback(...)包裹的JSON内容,否则这个方法无效。

4. 临时禁用浏览器CORS(仅调试用,禁止生产环境)

如果你只是本地调试,可以临时关闭浏览器的同源策略:

  • Chrome:右键快捷方式,属性里的目标后面加 --disable-web-security --user-data-dir="C:/ChromeDevSession"(路径自定义)
  • Firefox:安装CORS Everywhere插件

这个方法只是临时调试用,不能给用户使用,因为会带来安全风险。

另外,你代码里的crossDomain: true其实对解决这个问题没用,这个参数主要是让jQuery在跨域时发送OPTIONS预检请求,但核心还是需要服务器配合返回允许的头。

内容的提问来源于stack exchange,提问作者jks

火山引擎 最新活动