Javascript AJAX永远不会成功

Javascript AJAX永远不会成功,javascript,json,ajax,Javascript,Json,Ajax,我有一个GET API,它提供了以下结果: 以下代码尝试获取此JSON信息: <script> jQuery(document).ready(function ($) { $.ajax({ url: 'http://localhost:15840' + '/totem/GetRestaurants', type: "GET", dataType: "jsonp", cross

我有一个GET API,它提供了以下结果:

以下代码尝试获取此JSON信息:

<script>
   jQuery(document).ready(function ($)
   {       
      $.ajax({
         url: 'http://localhost:15840' + '/totem/GetRestaurants',
         type: "GET",
         dataType: "jsonp",
         crossDomain: true,
         complete: function (data)
         { 
            alert (data)
            for (var restaurant in data)
            {
               document.getElementById('restaurants').innerHTML = '<li class="gallery-image" > <a href="3.html" class="thumb"><img src="img/restaurante-02.jpg" alt="" /><div class="gallery-text"><span>FOOD RESTAURANT</span></div></a></li >'
             }   
          },
          error: function () {
             alert("error");
          }
       });
    });
</script>
错误方法始终会被执行,完整的警报仅显示以下信息:

<script>
   jQuery(document).ready(function ($)
   {       
      $.ajax({
         url: 'http://localhost:15840' + '/totem/GetRestaurants',
         type: "GET",
         dataType: "jsonp",
         crossDomain: true,
         complete: function (data)
         { 
            alert (data)
            for (var restaurant in data)
            {
               document.getElementById('restaurants').innerHTML = '<li class="gallery-image" > <a href="3.html" class="thumb"><img src="img/restaurante-02.jpg" alt="" /><div class="gallery-text"><span>FOOD RESTAURANT</span></div></a></li >'
             }   
          },
          error: function () {
             alert("error");
          }
       });
    });
</script>
但是如果我去chrome inspector,响应看起来很好:

为什么会这样

编辑:

使用以下代码,不会发生任何事情:

<script>
    jQuery(document).ready(function ($)
    {       
        $.ajax({
            url: 'http://localhost:15840' + '/totem/GetRestaurants',
            type: "GET",
            dataType: "jsonp",
            crossDomain: true,
            success: function (data)
            {
                alert ("hello success")
            }
        });
    });
</script>
你说:

…但是响应的屏幕截图显示这是JSON而不是JSONP

您需要:

将数据类型设置为json 将服务器更改为使用JSONP响应,请参阅以获取更多信息。 请注意,JSONP是一种肮脏而危险的黑客行为,我们现在有了CORS,这是一种标准化且灵活的方法,可以选择性地禁用没有JSONP缺点的同源策略。所以不要选择第二种

您可能尝试过使用dataType:jsonp,因为您遇到了如下错误:

XMLHttpRequest无法加载XXX无“访问控制允许来源”标题

发生此错误是因为您违反了同源策略。JSONP是解决这个问题的一种方法,CORS是一种更好的方法。这两种方法都需要更改服务器以允许它们工作


有关更多信息,请参阅。

在发送jsonp请求时,需要更改返回数据的方式。您需要将JSON对象包装在$\u GET['callback']中。如果您的后端是php,您可以尝试以下代码

 $response['data'] = array('sdu');
 $response = json_encode($response);
 echo htmlspecialchars($_GET['callback']) . '(' . $response . ')';
 exit;

错误回调将告诉您该问题。错误:functionerr{console.logerr;}尝试在传递给请求的对象中使用success而不是complete。@Harish如果设置success,它将永远不会到达。您的数据的可能副本可能是解析JSON后的对象。alert需要一个字符串,当它被传递到一个对象时,它会将其字符串化——默认情况下,这会产生您看到的毫无帮助的[object]。您对数据所做的其他一切都应该可以正常工作,但alert可以做到这一点。控制台允许您查看对象中的内容,但警报和其他仅将数据强制为字符串的内容则不允许。headeraccess-control-allow-origin:*;如果您使用JSONPtext/javascript,那么它是没有意义的。JavaScript的正确MIME类型是application/JavaScript。@昆汀你说得对,我们可以忽略标题部分。我已经编辑了我的答案。我的后端是ASP.NETC,它会是什么样子?我不知道.NET,但我可以简化上面的代码。只需在.Net文件中获取get请求中的回调变量,并在该get变量中返回json数据包装echo$\u GET['callback']..'{key:value}.;'也就是说,您需要返回类似以下内容的'jquery11205380381429956309_1552996718249{key:value}'将jQuery1200538038181429956309_1552996718249替换为callback get变量中的值,键值是json对象。要实现这一点,我必须在.NET ASP c后端进行哪些更改?@Lechucico-我在回答中引用了它,它说明了如何设置响应头的细节取决于Bob的HTTP服务器和/或服务器端编程语言。有一种方法可能会有所帮助。这已经发生了。