2011-06-13 90 views
5

我正在使用jsonp和ajax查询在另一台服务器上用java编写的web服务。我使用以下的jQuery命令:jQuery,ajax和jsonp有问题

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "sites_return" 
}); 


function jsonp_callback(data) { 
    console.log(data); 
} 

function sites_return(data) { 
    console.log(data); 
} 

所以我的问题是,查询结束后,被称为所谓的jsonp_callback功能。我在哪里可以清楚地看到JSON格式的字符串:

{"listEntries":["ELEM1", "ELEM2", "ELEM3", etc...]} 

但经过功能sites_return被调用时,完整的事件触发时,我得到如下:

Object { readyState=4, status=200, statusText="parsererror"} 

也可对照的jsonp_callback功能在sites_return函数之前调用。另外,如果我从代码中取出jsonp_callback函数,我会得到一个投诉它的萤火虫,该函数没有实现。

我的问题三倍: 1)我在jquery方面做错了什么? 2)为什么json在jsonp_callback中正确解析,但没有sites_return? 3)我能做些什么来解决这些问题?

编辑

一些新的发展。根据这里的评论是一些额外的信息。

下面是什么出来的HTTP响应

jsonp_callback({"listEntries":["ELEM1", "ELEM2", "ELEM3"]}) 

的我认为这是什么原因jsonp_callback被调用。我想现在我的问题变成了,是否有任何方法可以控制这种情况(假设我没有访问后端Web服务的权限)。

+0

我认为我们将需要看到所有的JSON,因为它可能会导致解析错误。 – Pointy 2011-06-13 13:39:41

+0

此外,不清楚为什么“jsonp_callback”函数被调用。 – Pointy 2011-06-13 13:40:47

+0

这就是所有的json。我用虚拟名称替换了实际的元素,但是格式完全相同(当然不包括等等)。以下是HTTP标题响应中的内容。 jsonp_callback({“listEntries”:[“ELEM1”,“ELEM2”,“ELEM3”]})。看着它,我认为函数被调用,因为它是如何在http头中格式化的。 – sumone4life 2011-06-13 13:46:48

回答

1

我相信sites_return函数的第一个参数是jqXHR Object。而不是complete尝试使用success

但是,这仍然可能不起作用,因为它似乎有一个解析错误(在从oncomplete调用的函数返回值sites_return中提到)。因此,你首先需要检查你的json字符串。

要验证JSON,您可以使用http://jsonlint.com/

+0

它似乎是问题是jsonp_callback(...),它可能是从后端格式化,并不受我的控制。看起来我需要找到解决这个问题的创造性方法。 – sumone4life 2011-06-13 14:14:55

1

认为的问题是,你的服务器没有表现jQuery的期望它的方式。 JSONP“协议”不是很稳定,但通常应该发生的事情是,网站应该查找“回调”参数,并在构建JSONP响应时将其用作函数名称。它看起来好像您的服务器始终使用函数名称“jsonp_callback”。

也许工作要告诉jQuery的,你的回调 “jsonp_callback” 直接:但是肯定

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "jsonp_callback" 
}); 

不是100%。

0

如果您无法更改远程服务器返回的JSONP函数包装器,那么jQuery的$.ajax()可能会在这里矫枉过正。最终,你所做的只是注入一个脚本引用到wsUrl,该脚本引用了一个以JavaScript对象字面量作为其输入参数的jsonp_callback的调用。

你可以很容易地做这样的事情,避免周围的回调命名/语法混乱:

$.getScript(wsUrl); 

function jsonp_callback(response) { 
    // Access the array here via response.listEntries 
} 
2

希望这有助于〜

var url = "http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false"; 
var address = "1600+Amphitheatre+Parkway"; 
var apiKey = "+Mountain+View,+CA"; 

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?", 
    function(data, textStatus){ 
    console.log(data); 
    });