2

我正在尝试使用 JSONP 调用 web 服务,传入一个整数以获取两个整数。通常我会使用常规 JSON,但我会调用不同的端口号(从网站到 web 服务,但都在同一个域中)。

对于上下文,我传入用户 ID 以获取未读任务和通知的数量,以填充屏幕上显示的一些数字。

这是代码:

var url = "localhost:13742/api/notices/get" ;
$.getJSON(url + "?callback=?", $("#__UserId").val(), function (response) {
    console.log("Number of unread tasks- " + response.UnreadTasks + ". Number of unread notices- " + response.UnreadNotices);
});

正如标题所示,我指定的回调没有被触发——我没有收到任何日志,包括错误。我知道服务器端代码正在工作,因为我可以通过浏览器手动访问它——我只需传入查询字符串,它就可以正常工作(将信息作为 XML 文档返回)。目前还没有安全措施,所以我不必担心传入身份验证标头。

这是我第一次使用 JSONP,尽管我已经大量使用了常规 JSON。也许有一个更简单的选择,因为我可以通过浏览器轻松完成。

4

3 回答 3

1

您的服务器需要返回有效的 JSONP 响应才能使其正常工作。JSONP 的特殊之处在于它只是一个 JavaScript 文件。这就是它跨域的工作方式,因为它只是<script>在你的头上添加了一个标签。

JSONP不是JSON,也不是 XML。您说您的 URL 将数据作为 XML 文档返回?这是不正确的。这就是为什么它不起作用。

JSONP 应该只是对通过传入函数的函数调用,callback=数据作为第一个参数。

我不知道您的服务器是什么语言,但在 PHP 中它可能如下所示:

<?php
$data = array(
    'UnreadTasks' => 5,
    'UnreadNotices' => 8
);

header('Content-type: application/javascript');
echo $_GET['callback'] . '(' . json_encode($data) . ');';
于 2013-07-09T16:22:31.953 回答
0

尝试ajax像这样使用:

$.ajax({

  url: "localhost:13742/api/notices/get",

  dataType: "jsonp",

  data: $("#__UserId").val(),

  success: function(data) {
    console.log("Number of unread tasks- " + data.UnreadTasks + ". Number of unread notices- " + data.UnreadNotices);
  },

  error: function(jxhr, status, err) {
    console.log("Error, status = " + status + ", err = " + err);
  }
});

你也确定'localhost:13742/api/notices/get'支持jsonp - http://en.wikipedia.org/wiki/JSONP

于 2013-07-09T13:54:02.943 回答
0

原来这是一个客户端问题。显然,用户 ID 需要包含在 URL 中。看来服务器毕竟还好。相当无聊的解决方案,但我们走了。

感谢所有提供帮助的人。

$.ajax({
            url: "localhost:13742/api/Notices/" + $("#__UserId").val(),
            dataType: "jsonp",
            success: function (data) {
                console.log("Number of unread tasks- " + data.UnreadTasks + ". Number of unread notices- " + data.UnreadNotices);
            },
            error: function (jxhr, status, err) {
                console.log("Error, status = " + status + ", err = " + err);
            }
        });
于 2013-07-16T11:42:33.783 回答