为什么我的跨域JSON调用不起作用?

时间:2013-07-03 05:56:48

标签: json jquery jsonp getjson

远程网址http://remote-server/json-data.php包含以下格式的数据:

[{"id":"1","partname":"R1","date":"10/12/2012"},{"id":"2","partname":"R2","date":"10/10/2012"},{"id":"3","partname":"R3","date":"07/12/2012"},{"id":"4","partname":"R4","date":"14/06/2012"}]

这是我的jQuery应该读取上面的数据并将其显示在html或php文件中。目前无效:

$(document).ready(function () {
var url = "http://remote-server/json-data.php";

var success = function(data){
    data = $.parseJSON(data);
    $.each(data, function(index, element) {
        $('div.outerBox').append('<div>'+element.partname+'/'+element.date+'</div>');
    });
}


$.ajax({
    type: 'GET',   
    url: url,
    dataType: "jsonp",
    crossDomain: true,         
    cache:false,
    success: success,
    error:function(jqXHR, textStatus, errorThrown){
      alert(errorThrown);
    }
});
});

当我刷新页面时,我在javascript警告框中收到一条错误消息,如下所示:Error: jQuery142452552225_55355545554 was not called

我尝试将该远程文件放入我的本地服务器,它似乎与$.getJSON()函数一起正常工作。不知道我在这里做错了什么。

2 个答案:

答案 0 :(得分:2)

如果服务器未准备好处理JSONP请求,则无法正常工作。

JSONP并不是严格意义上的客户端数据操作,它涉及服务器交互

使用jsonp时,响应应该包含在javascript函数中。

所以为了简单起见,比方说,你有一个空的JSON对象,服务器将返回给你。即{}

为您要做的对象提出标准请求

$.ajax({
    type: 'GET',   
    url: url,
    dataType: "json",
    success: function(data) {
      alert("Retrieved : " + JSON.stringify(data);
    },
    error:function(jq, st, error){
      alert(error);
    }
});

所有这一切都是制作标准HTTP请求并从网址中检索空对象。

如果您想将JSONP与相同的网址一起使用,请尝试使用

$.ajax({
    type: 'GET',   
    url: url,
    dataType: "jsonp",
    crossDomain: true,
    success: function(data) {
      alert("Retrieved : " + JSON.stringify(data);
    },
    error:function(jq, st, error){
      alert(error);
    }
});

这样做会使您添加的网址?callback={Some Random jQuery function}。在您的情况下,随机jQuery函数是jQuery142452552225_55355545554。服务器必须获取该空JSON对象并将其包装在回调中,因此它应该返回{}而不是返回jQuery142452552225_55355545554({}),其中包含application / json的HTTP内容类型头。

这是对coderwall的JSON请求的一个小提示,它失败了,然后尝试一个成功运行的JSONP请求。 JSONP Example

答案 1 :(得分:1)

  

远程网址http://remote-server/json-data.php包含数据   这种格式:

     

[{ “ID”: “1”, “零件名称”: “R1”, “日期”: “2012年10月12日”},{ “ID”: “2”, “零件名称”: “R2” , “日期”: “2012年10月10日”},{ “ID”: “3”, “零件名称”: “R3”, “日期”: “2012年7月12日”},{ “ID”:” 4" , “零件名称”: “R 4”, “日期”: “14/06/2012”}]

嗯,这就是问题所在。您的远程URL返回JSON,而不是JSONP。这就是为什么你不能消费它。远程服务器应该返回JSONP:

callbackFunctionName([
    {
        "id": "1",
        "partname": "R1",
        "date": "10/12/2012"
    },
    {
        "id": "2",
        "partname": "R2",
        "date": "10/10/2012"
    },
    {
        "id": "3",
        "partname": "R3",
        "date": "07/12/2012"
    },
    {
        "id": "4",
        "partname": "R4",
        "date": "14/06/2012"
    }
]);

其中callbackFunctionName应通过将参数传递给服务器来动态指定。像这样:

http://remote-server/json-data.php?callback=callbackFunctionName

当你调用这个url时,你应该返回一个JSONP响应。