我在ASP.NET中创建了一个json webservice。
URL http://mydomain:21130/JSONdata.aspx?Option=GetListRootMenus
数据返回:
{"NumberOfMenu":"2", "Menus":[{"MenuKey":"menu_home", "MenuLevel":"1" },{"MenuKey":"menu_info", "MenuLevel":"1" }]}
之后,我通过JSONP解析
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery.getJSON demo</title>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p> this is a param </p>
<script>
$(document).ready(function(){
console.log("zc");
$.ajax({
dataType: "jsonp",
type: 'GET',
url: "http://mydomain:21130/JSONdata.aspx?Option=GetListRootMenus&callback=?",
success: function(data) {
console.log("123");
},
error: function(){
console.log("456");
}
});
});
</script>
</body>
</html>
但错了。我不知道为什么:(
答案 0 :(得分:2)
正如我在评论中解释的那样,您的服务返回JSON,而jQuery需要JSONP。这是一个问题,因为响应将被评估为JavaScript,但您不会发回有效的JavaScript。
由于您可以控制服务器,因此您有三种可能的解决方案:
如果没有跨域问题,因为站点本身也是从该域提供的,那么简单地让jQuery通过将dataType
更改为json
并删除callback=?
来发出真正的Ajax请求来自网址。
如果存在跨域问题,您仍然可以执行我在第一个解决方案中所说的内容,但此外,还要在服务器上启用CORS。简而言之,这允许其他站点向您的服务器发出Ajax请求。请查看http://enable-cors.org/,了解如何为您的服务器启用它。
JSONP就是动态地包含JavaScript。这适用于跨域,因为<script>
元素不具有Ajax具有的同源限制。但是,它仍然是服务器必须支持的东西,因为它必须返回有效的JSON。如果您的JSON响应是
{"foo": 42}
然后JSONP响应将是
func({"foo": 42});
此示例中的函数名称(func
)取自您可以任意选择的某个GET参数,但最常见的是callback
。 jQuery实际上会选择一个随机函数名称,因此它会发送类似
callback=jQuery123135343456456
您的服务必须使用该值并将其用作JSONP的函数名称,即
jQuery123135343456456({"foo": 42});
另见