2012-01-05 162 views
1

有一个域名,我不控制它返回JSON数据 - 要http://services.example.com/search?store=ITUNES&q=twitter产生类似403禁止对JSONP请求

{ 
    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

您需要参数中的回调函数名称。你能发布确切的网址吗? – Joseph 2012-01-05 23:31:55

+1

JSONP设置需要来自服务器端的合作。似乎服务器不使用JSONP – Joseph 2012-01-06 01:54:13

回答

-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来破坏其他服务器资源)。

+1

http://api.jquery.com/jQuery.getJSON/ - 脚本和JSONP请求不受同一个源策略限制。 – Joseph 2012-01-05 23:27:36

+0

请重新阅读他想要做的事情。数据看起来不是JSONP或脚本,因此使用这些方法将不起作用。 – buley 2012-01-05 23:29:46

+1

*有没有什么办法可以在不进行任何服务器端更改的情况下获取这些数据?* - 他这样说。另外,JSONP不会绑定到相同的原始策略。直到他用真正的网址编辑网址,我们不会确定哪里出错。这是他放置的“example.com”。 – Joseph 2012-01-05 23:44:20

-2

请尝试下面的代码片段。请记住,整个响应将被存储为在控制台的对象并且可以简单地引用与数据[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); 
}); 

希望它解决了您的问题。