修改 getJSON 以使用 CORS

Posted

技术标签:

【中文标题】修改 getJSON 以使用 CORS【英文标题】:modify getJSON to work with CORS 【发布时间】:2014-05-12 19:09:29 【问题描述】:

我正在寻找允许使用 $.getJSON 进行跨域访问的方法。我遇到了一些解决方案,这些解决方案表明使用 CORS 是解决这个问题的方法。但是大多数解决方案都有通用的ajax格式。

我无法使用 JSONP,因为我从无权访问的服务器获取数据。有没有办法使用 $.getJSON 修改此代码以获取数据?

$.getJSON(jsonURL, function(res)
    console.log(JSON.stringify(res));
);

或者我必须对 CORS 使用 ajax 格式吗?

【问题讨论】:

【参考方案1】:

如果您有权为加载 JS 脚本的页面设置 HTTP 响应标头,那么是的,您可以使用 CORS 发送跨域请求。但是,旧版浏览器不支持此功能。

您需要设置Access-Control-Allow-Origin 标头,例如

Access-Control-Allow-Origin: *

或者

Access-Control-Allow-Origin: http://host-of-other-site.com 

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

【讨论】:

您能否澄清一下您所说的确切含义 - the HTTP Response Headers for the page that loads your JS scripts。我目前正在 html 文件中编写 javascript 来获取数据。 如果您正在加载www.my-server.com/your_page(其中 your_page 包含您的 JS 代码等),您需要更改您的 Web 服务器(apache、nginx、WEBrick 等)以设置 HTTP 标头your_page 或所有页面的 HTTP 响应。这是网络服务器配置和安全问题的问题。 我的 HTML 文件在我的本地系统 - MAC 桌面上。所以我不清楚该怎么做。 或者,我可以编写 python 脚本等来获取数据吗?当前的问题与浏览器有关 - 对吗? 当然,如果后端检索数据,您可以规避该问题。但是你需要某种后端。【参考方案2】:

我无权访问的服务器

我想,这会折断你的脖子。 您需要某种对服务器的访问权限或联系拥有该权限的人。至少你要调整HTTP-Header进入你的域Access-Control-Allow-Origin是关键字。

看看MDN

【讨论】:

Server which I do not have access 我的意思是我有一个以 json 格式返回数据的 URL。我无法修改返回为 jsoncallback 格式的内容。 正如我所写:源必须允许带有Access-Control-Allow-Origin 的请求。如果您被允许访问,一切都应该照常进行。 $.getJSON(URL, f). “至少你必须调整 HTTP-Header 以输入你的域 Access-Control-Allow-Origin os 关键字。” 服务器不必明确允许来源,它可以回显接收到的任何内容(这就是开放式 CORS 服务器的做法)。但是,是的,基本上你是正确的:如果 OP 的来源已经被允许,那么除非 OP 使用的是 IE9 或更早版本,否则$.getJSON 应该可以工作。如果不允许 OP 的来源,那么他/她必须让服务器的运营商允许它,或者不能直接从浏览器使用该 URL。 @T.J.Crowder 我也在考虑其他选择。我们可以有一个 python 脚本来发出 HTTP Post/Get 请求,而不是使用来自 javascript 的 getJSON 吗? @Dinesh:是的,这是一个相当标准的解决方法,从您自己的服务器发出请求。

以上是关于修改 getJSON 以使用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用getJSON,用post方法发送数据?

不使用 'async: false' 进行顺序 $.getjson 调用的替代方法

序列化表单getjson不起作用

jQuery.getJSON(url, [data], [callback])

jQuery getJSON 超时

$.getJSON:javascript 不从上到下运行 [重复]