$.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”标头的主要内容,如果未能解决你的问题,请参考以下文章

$.getJSON() 回调函数没有执行的原因

jQuery getJSON 请求在有效请求上返回空

$.getJSON异步请求和同步请求

jQuery.getJSON().error() 没有在 404 错误上执行

jQuery异步请求(如getJSON)跨域解决方案

$.getJSON的同步与异步请求