1

我正在开发 HTML5、jQuery 移动应用程序。我必须使用第 3 方 JSON Web 服务来获取数据。但是我的 jquery 函数中有 parseerror。似乎问题在于 Web 服务发送 JSON。我必须使用 JSONP,因为它是跨域的。无论如何使用jQuery或javascript来做到这一点。这是我正在使用的代码。

$.ajax({
            url : jsonServiceURL + "scheduleService/retrieveMySchedules.json?callback=?",
            dataType : "json",
             beforeSend: function(x) {
              if(x && x.overrideMimeType) {
               x.overrideMimeType("application/json;charset=UTF-8");
              }
             },
            timeout : 5000
        }).success(function() {
                alert('pass');      
        }).error(function(httpObj, textStatus) {        
            alert(textStatus);
        }); 

请求去了。回应也来了。但它说解析错误。我觉得这在 JSON 和 JSONP 中有所不同。如果我将 URL 设置为类似http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?我的代码工作正常,没有问题。第 3 方网络服务也正确,因为所有 iphone 应用程序都可以正常工作。我看到的唯一区别是 JSON 以 . 开头,[{而 JSONP 以somefunction({.

JSON 是有效的。我使用一些在线工具对其进行了检查,并且有几个 iPhone 应用程序可以与该 Web 服务一起使用而没有问题。似乎我无法用 jquery 解析它,因为它们发送的是 JSON 而不是 JSONP。如果我的想法是错误的,请纠正我。对此有哪些可能的解决方案?

4

1 回答 1

1

如果您正在执行跨域请求,请使用 jsonp。那挺好的。它与您的标准 json 请求(使用 XmlHttpRequest 完成)略有不同。

您必须发送您的请求,使其精确为 jsonp :

$.ajax({
       url : jsonpServiceURL + "scheduleService/retrieveMySchedulesJsonp?callback=?",
       dataType : "jsonp"           
 });

然后你的代码中必须有一个函数作为你的回调:

function InBrowser_receive(answer) {
        console.log('received:', answer)
    // do things with answer (the received json)
}

就个人而言,我通常不费心将回调的名称发送到服务器,因为我也编写了服务器部分:我只是硬编码服务器的回调名称。

而且我也喜欢使用 json 结构向服务器发送参数。所以我发送请求的函数通常是这样的:

function sendToServer(message) {
    $.ajax(
        {
            url: serverUrl,
            data: 'theQuery=' + JSON.stringify(message),
            crossDomain: true,
            dataType: 'jsonp'
        }
    );
} 

这是我的一个开源代码中的一个示例: https ://github.com/Canop/braldop/blob/master/chrome/braldop/inext_com.js

发送函数是

braldop.sendToBraldopServer

接收者是

receiveFromMapServer
于 2012-04-25T06:31:55.610 回答