【问题标题】:Unable to get data from web service while using JSONP使用 JSONP 时无法从 Web 服务获取数据
【发布时间】:2014-01-21 03:09:43
【问题描述】:

我正在尝试使用 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 服务获得响应数据。

【问题讨论】:

  • 服务是否支持JSONP?
  • 我正在使用 C# Web 服务。它支持 JSON。如何让它支持 JSONP?
  • 不知道;取决于你的框架。但是 jsonp 需要明确的服务器端支持。检查您的框架的文档。

标签: javascript jquery json web-services jsonp


【解决方案1】:

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

JSONP 的理念是浏览器将其作为 javascript 加载和执行,而不是作为 Ajax 数据。所以要传递数据,响应需要调用一个回调函数,并将数据作为参数传递。响应可能如下所示:

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

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

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

【讨论】:

  • 我可以访问服务器配置。这是服务器中的“接受控制允许来源”设置吗?还是我必须更改服务响应本身?
  • 可能取决于您的网络服务器。谷歌周围。以下是在 Tomcat 中的操作方法:stackoverflow.com/questions/12383109/…。我不知道 C# 框架如何处理这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2015-11-24
  • 2021-09-07
相关资源
最近更新 更多