" Uncaught SyntaxError:意外的令牌"什么时候解析jsonp

时间:2014-10-04 20:21:21

标签: javascript jquery asp.net json

我在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>

但错了。我不知道为什么:( enter image description here

1 个答案:

答案 0 :(得分:2)

正如我在评论中解释的那样,您的服务返回JSON,而jQuery需要JSONP。这是一个问题,因为响应将被评估为JavaScript,但您不会发回有效的JavaScript。

由于您可以控制服务器,因此您有三种可能的解决方案:

1。告诉jQuery期待JSON

如果没有跨域问题,因为站点本身也是从该域提供的,那么简单地让jQuery通过将dataType更改为json并删除callback=?来发出真正的Ajax请求来自网址。

2。启用CORS(并告诉jQuery期望JSON)

如果存在跨域问题,您仍然可以执行我在第一个解决方案中所说的内容,但此外,还要在服务器上启用CORS。简而言之,这允许其他站点向您的服务器发出Ajax请求。请查看http://enable-cors.org/,了解如何为您的服务器启用它。

3。返回JSONP

JSONP就是动态地包含JavaScript。这适用于跨域,因为<script>元素不具有Ajax具有的同源限制。但是,它仍然是服务器必须支持的东西,因为它必须返回有效的JSON。如果您的JSON响应是

{"foo": 42}

然后JSONP响应将是

func({"foo": 42});

此示例中的函数名称(func)取自您可以任意选择的某个GET参数,但最常见的是callback。 jQuery实际上会选择一个随机函数名称,因此它会发送类似

的内容
callback=jQuery123135343456456

您的服务必须使用该值并将其用作JSONP的函数名称,即

jQuery123135343456456({"foo": 42});

另见