有一个我无法控制的域返回JSON数据 - 转到http://services.example.com/search?store=ITUNES&q=twitter会产生类似
的内容{
MySearch: {
resultCount: 1
results: [
{ name: "twitter" }
]
}
}
当我尝试从其他域获取jsonp时,例如来自我自己的计算机(使用jQuery) -
$.ajax({
url: 'http://services.example.com/search?store=ITUNES&q=twitter',
dataType: 'jsonp',
success: function(data) {
console.log('hi');
}
});
我得到“状态代码:403禁止”。
以下是服务器响应标头:
Connection:keep-alive
Content-Length:9
Content-Type:text/plain
Date:Thu, 05 Jan 2012 20:33:04 GMT
Server:WEBrick/1.3.1 (Ruby/1.9.3/2011-10-30)
X-Frame-Options:sameorigin
有没有办法在不进行任何服务器端更改的情况下获取此数据?
答案 0 :(得分:-2)
尝试下面的代码段。请记住,整个响应将作为对象存储在控制台中,您只需使用data [i]等引用每个键值对。
var jServices = jQuery.noConflict();
jServices.ajaxSetup({
contentType: "application/jsonp; charset=UTF-8"
});
jServices.getJSON("http://services.joppio.com/services/search?session=AF8990-34GDC-03345&store=ITUNES&pos=0&cnt=10&q=twitter", function (data) {
console.log(data);
});
希望它能解决你的问题。
答案 1 :(得分:-3)
这是由于浏览器的cross origin resource sharing policy。
要启用此功能,您必须让原点添加特殊标题以“预检”您的请求。否则,JSONP tactic将允许您跨域访问数据,但它必须实际上是JSONP而不仅仅是JSON。
以下是如何在PHP中启用跨域资源共享的示例:
<?php
header('Access-Control-Allow-Origin: http://sub.domain.com');
header('Access-Control-Allow-Credentials: true' );
?>
正如你所说,不幸的是我认为这是你无法控制的。实际上,安全机制的部分原因是为了防止这样的事情发生(即通过使用它的JSON来掠夺另一个服务器资源)。