Javascript AJAX永远不会成功
我有一个GET API,它提供了以下结果: 以下代码尝试获取此JSON信息: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
<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服务器和/或服务器端编程语言。有一种方法可能会有所帮助。这已经发生了。