我正试图使用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。也许有一个更简单的选择,因为我可以通过浏览器轻松完成。
您的服务器需要返回有效的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) . ');';
尝试像这样使用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/notes/get"支持jsonp-http://en.wikipedia.org/wiki/JSONP
发现这是一个客户端问题。显然,用户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);
}
});