403禁止JSONP请求

时间:2012-01-05 20:48:53

标签: javascript ajax json jsonp

有一个我无法控制的域返回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

有没有办法在不进行任何服务器端更改的情况下获取此数据?

2 个答案:

答案 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来掠夺另一个服务器资源)。