【问题标题】:Work with JSON web service using jQuery使用 jQuery 处理 JSON Web 服务
【发布时间】:2012-05-05 19:24:17
【问题描述】:

我正在开发 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。如果我的想法是错误的,请纠正我。有什么可能的解决方案?

【问题讨论】:

    标签: jquery json jquery-mobile jsonp


    【解决方案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
    

    【讨论】:

    • 感谢您的回答。但它不起作用,因为响应不在 JSONP 中。我必须指定回调,因为它是第 3 方。
    • 如果你精确回调,那么它在 jsonp 中。或者我错过了什么。
    • 是的。问题是 Web 服务只提供 JSON 而不是 JSONP。谢谢。
    • 如果web服务不能做jsonp,就不能做跨域请求。
    • 是的。我想。这就是为什么我在这里也提出这个问题以确保这一点。非常感谢你的朋友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多