$.getJSON 请求上没有“Access-Control-Allow-Origin”标头
Posted
技术标签:
【中文标题】$.getJSON 请求上没有“Access-Control-Allow-Origin”标头【英文标题】:No 'Access-Control-Allow-Origin' header on $.getJSON request 【发布时间】:2015-07-03 22:38:27 【问题描述】:我正在尝试向以下 URL 发出简单的 $.getJSON
请求:
http://dev.markitondemand.com/Api/v2/InteractiveChart/json?parameters=%7B%22Normalized%22%3Afalse%2C%22NumberOfDays%22%3A7%2C%22DataPeriod%22%3A%22Day%22%2C%22Elements%22%3A%5B%7B%22Symbol%22%3A%22NUS%22%2C%22Type%22%3A%22price%22%2C%22Params%22%3A%5B%22c%22%5D%7D%5D%7D
请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:1337' 因此不允许访问。
我的代码很简单:
var ticker = "CRR";
var url = "http://dev.markitondemand.com/Api/v2/InteractiveChart/json?parameters=%7B%22Normalized%22%3Afalse%2C%22NumberOfDays%22%3A7%2C%22DataPeriod%22%3A%22Day%22%2C%22Elements%22%3A%5B%7B%22Symbol%22%3A%22" + ticker + "%22%2C%22Type%22%3A%22price%22%2C%22Params%22%3A%5B%22c%22%5D%7D%5D%7D";
$.getJSON(url, function(data)
console.log(data);
).success(function()
$('#show-data').html("Successfully retrieved data.");
).error(function()
$('#show-data').html("Service Unavailable.");
);
它没有运行任何错误或成功函数,当我尝试 $.ajax
时,我得到了同样的结果。就我的设置而言,我正在尝试一个 MEN 项目,所以我的本地主机上的 Mongo、Express 和 Node.js。任何帮助将不胜感激。
【问题讨论】:
您可以尝试设置dataType: 'jsonp'
,您还必须使用回调函数——参见此处***.com/questions/5943630/…
【参考方案1】:
您显然是在尝试跨域 Ajax 请求。这意味着您正在尝试联系与原始网页所在的域/端口不同的服务器。这称为跨源请求,默认情况下是不允许的。您可以阅读浏览器的同源安全策略here。
为了被允许直接发出跨域请求,您发出请求的服务器必须明确允许它。
Access-Control-Allow-Origin
标头是允许此类访问的一种方式,但它显然没有应用该标头,因此请求被浏览器拒绝。您可以阅读有关 CORS(跨源资源共享)的工作原理here。
其他发出跨源请求的方法是使用 JSONP(也需要与目标服务器合作以支持 JSONP 请求)或通过代理(您可以联系的另一台服务器,该服务器可以向所需服务器发出请求)并将结果返回给您)。代理需要在您有权访问的服务器上使用您自己的服务器代码,但不需要目标服务器的配合。
根据the doc on this page,Markit On Demand 似乎确实支持 JSONP,因此您可以将该表单用于跨源请求。如果您为$.ajax()
设置适当的dataType: "jsonp"
选项,jQuery 的 ajax 支持该格式。
【讨论】:
感谢您的深入解答。我以前很怕那个。该请求的文档发出了一个 jsonp 请求,但是这导致了 500 服务器错误的问题(当我尝试使用无效参数发出请求时发生这种情况〜错误处理等)。最后,我最终使用了 Quandl,但至少现在我完全理解了原因。希望这对其他人有所帮助。谢谢你。 :)【参考方案2】:看到此消息是因为服务器不允许通过 Ajax 进行跨域资源。因此,要么让服务器管理员为您启用 cors,要么尝试使用 JSONP(如果服务器支持)。
http://enable-cors.org/server.html
【讨论】:
以上是关于$.getJSON 请求上没有“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章