2015-10-03 45 views
0

我正在尝试使用JSON响应的api。但是我收到此错误:跨源请求被阻止:相同的源策略不允许读取远程资源。但是我能够在本地解析相同的json。消费API的CORS问题

function getData(lat,long) { 

var url = "http://utilities- oyorooms.herokuapp.com/api/v2/search/hotels?filters[coordinates][longitude]=" + long + "&filters[coordinates][latitude]=" + lat + "&filters[coordinates][distance]=20&fields=name,longitude,latitude,oyo_id&access_token=MXB2cE44LWJGaTViWExHQ0xCOC06VUtucEhhVV9mclNNeWdrNFBveFY=&additional_fields=room_pricing"; 

$.getJSON(url, function(data) { 

$(data).each(function(key, val) { 


$.each(val.hotels , function(k , v){ 
    alert(v.distance); 




});   
}); 
}); 

} 

回答

0

However I am able to parse the same json locally.

权。 SOP适用于浏览器制作交叉来源ajax请求(以及一些其他浏览器的东西,如iframes,加载图像到画布等)。如果您将URL粘贴到地址栏中,则不受SOP限制。如果从命令行使用curl或wget来检索它,则不受SOP约束。但是,如果您在浏览器中使用ajax(getJSON是ajax),那么必须遵守SOP。

你无法用纯粹的浏览器来解决这个问题(这就是整个问题)。如果端点不支持CORS并允许您的起源向它发出请求(他们必须在服务器端执行这些请求),那么您无法通过带有Ajax的浏览器执行此操作。

可能通过设置您自己的服务器,向您的服务器发出请求,并让服务器调用其他服务器来获取数据,因为您的服务器不受SOP限制。如果你做了这么多,并且如果端点不希望你,希望在某个阶段发现它们阻止你的服务器的IP。

如果控制你所呼叫的端点的服务器端,并希望能够通过您的网页的起源访问它,this answer解释了你会怎么做(用伪代码)。

0

跨源请求策略可防止来自其他网站的Ajax请求。你有3个选项,以防止这种情况:

  1. 即成HTML /来自同一个域+端口JS文件作为JSON-后端
  2. 建立一个代理服务器来服务JSON
  3. 添加下面的HTTP标头到后端:

访问控制允许来源:http://foo.example

http://foo.example必须是Web服务器的URL服务您的HTML/JS