使用JSONP时无法从Web服务获取数据

时间:2014-01-03 12:34:56

标签: javascript jquery json web-services jsonp

我正在尝试使用JSONP进行Web服务调用。当我使用JSON调用服务时,它运行正常。以下是JSON的代码:

$.ajax({
                type:defaultOpt.type,
                contentType: "application/json; charset=utf-8",
                dataType: defaultOpt.dataType,
                url: defaultOpt.url,
                data: defaultOpt.data,
                success: defaultOpt.successCallback,
                error: defaultOpt.errorCallback,
                async: defaultOpt.asyn
});

然而,当我使用JSONP调用相同的服务时,我在响应中没有得到任何结果。 以下是使用JSONP调用的代码:

$.ajax({
                    dataType: 'jsonp',
                    data: defaultOpt.data,
                    url: defaultOpt.url,
                    success: function (data) {
                        alert('Success');
                    },
                    error: function (data) {
                        alert("Error");
                    }
 });

这是我使用JSONP时得到的字符串化响应。

{"readyState":4,"status":200,"statusText":"success"}

它显示成功但我没有从Web服务获得响应数据。

1 个答案:

答案 0 :(得分:1)

您的服务器可能不支持JSONP。然而。如果您控制服务器,则可以自己添加此支持。

JSONP的想法是浏览器加载并执行它作为javascript,而不是Ajax数据。因此,为了传递数据,响应需要调用回调函数并将数据作为参数传递。响应可能如下所示:

callback({"readyState":4,"status":200,"statusText":"success"});

您的网站当然需要指定回调函数,但我认为JQuery会自动为您生成此函数,并且此回调函数会调用您的成功函数。我对此并不完全确定,所以请查看文档。当然,服务器必须监听回调参数,因此它将该名称用于包装数据的函数调用。

你可能会说,JSONP是一个非常难看的黑客。对于所有现代浏览器都支持的跨域调用,有一个更好的解决方案,即向服务器的响应添加Accept-Control-Allow-Origin标头。