通过jQuery获取JSONP

时间:2011-06-02 11:21:32

标签: jquery jsonp

更新1:

如果我输入

,这就是我在浏览器中获得的内容

http://www.remote_host.com/feed.php?callback=jsonpCallBack

{
    "rss": {
        "channels": [
            {
                "title": "title goes here",
                "link": "http://www.remote_server.com/feed.php",
                "description": "description goes here",
                "items": [
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    },
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    },
                    {
                        "title": "item title goes here",
                        "link": "item link goes here",
                        "pubDate": "item date goes here",
                        "description": "item description goes here"
                    }
                ]
            }
        ]
    }
}

所以这不是jsonp?

原始问题:

我有以下脚本,我试图从远程主机获取json数据:

$(document).ready(function() {
    get_json_feed();

    function get_json_feed() {
        $.ajax({
            url: 'http://www.remote_host.com/feed.php?type=json',
            type: 'GET',
            dataType: 'jsonp',
            error: function(xhr, status, error) {
                alert("error");
            },
            success: function(json) {
                alert("success");
            }
        });
    }
});

但由于某种原因,我收到错误并发出警告:

  

警告:资源解释为   脚本但使用MIME类型传输   text / html的。

     

错误:未捕获的SyntaxError:   意外的令牌:

我做错了什么?

3 个答案:

答案 0 :(得分:7)

JSONP"协议"依赖于使用表单的JavaScript声明回复您的请求的网站

 someFunction( someJSON )

函数的名称作为代码中的参数提供,其理念是响应脚本一旦被浏览器使用和解释,将导致使用已解析的JSON blob调用该函数 - 就是说,一个JavaScript对象。 jQuery库将为您完成一些bookeeping工作,甚至可以创建要调用的全局范围函数(这将是仅调用您提供的回调的代码作为" success"参数)

因此,您应该检查该服务器的实际响应是什么样的。听起来好像它可能不是准备以这种方式响应的服务器。您可能需要确保您的网址上有一个额外的参数,其形式为" callback =?"。

答案 1 :(得分:6)

我不确切知道您面临的错误,但有一些有用的提示可以使用jsonp here

  • error:不会为跨域脚本和JSONP请求调用此处理程序。
  • 在ajax参数中写jsonp: 'callback', jsonpCallback: 'jsonpCallback'。 将jsonp设置为回调,然后将jsonpCallback设置为jsonpCallback,使查询字符串看起来像这样:

    http://domain.com/jsonp-demo.php?callback=jsonpCallback&name=watever

  • 使用JSONP加载JSON块。将在您的网址末尾添加额外的?callback=?以指定回调。

您的完整脚本如下所示:

<script>
    $(document).ready(function(){

        $("#useJSONP").click(function(){
            $.ajax({
                url: 'http://domain.com/jsonp-demo.php',
                data: {name: 'Chad'},
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'jsonpCallback',
                success: function(){
                    alert("success");
                }
            });
        });

    });

    function jsonpCallback(data){
        $('#jsonpResult').text(data.message);
    }
    </script>

<强> Example here

答案 2 :(得分:3)

看起来服务器返回错误的Content-type标头。