Ajax调用触发错误事件但返回200 ok

16
$.ajax({
        url: 'http://intern-dev01:50231/api/language',
        type: 'GET',
        dataType: 'json',
        success: function() {
            console.log('It Works!');
        },
        error: function (request,status, error) {
            console.log(error);
            alert(status);
        }
    });

为什么这个Ajax调用不起作用?如果我在浏览器中调用它,它运行良好:/。

以下是Fiddler返回的结果:

HTTP/1.1 200 OK
Content-Length: 122
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 26 Apr 2013 06:56:40 GMT

[{"LanguageId":1,"LanguageName":"Dansk"},{"LanguageId":2,"LanguageName":"Tysk"},{"LanguageId":3,"LanguageName":"Engelsk"}]

5个回答

21

你需要检查ajax响应是否有效。当你在ajax中指定时:

dataType: 'json',

如果响应不能被解析为JSON,即使服务器返回200 OK,jQuery也会触发错误事件。检查来自服务器的数据并确保其为有效的JSON(尝试使用JSONLint服务)。

如果返回的数据不是JSON或存在语法错误,则在服务器端代码中修复它们。您可以通过服务器端脚本返回 {}。

还可以尝试这个。

$.ajax({
    url: 'http://intern-dev01:50231/api/language',
    type: 'GET',
    cache: false,        
    complete: function (xhr, status) {
      if (status === 'error' || !xhr.responseText) {
          console.log(error);
          alert(status);
      }
      else {
       console.log('It Works!');.
      }
    }        
});

如果我使用jsonp,我会得到解析错误。 - user2314110
1
@user2314110 只需删除 dataType: 'json' 并尝试。请查看我的编辑答案。 - Bharat Chodvadiya
注意:如果响应为空(例如“”),则在dataType设置为json的情况下,$.ajax将报告错误。正如@BharatChodvadiya所述,如果删除dataType,则应该可以正常工作。 - Philip Murphy

9

状态码显示为200 OK,但出现了解析错误。问题在于数据类型:json。为了测试这个问题,可以删除该行代码,然后应该就可以正常工作了。为了解决这个问题,您可以将其更改为数据类型:text。请参考此链接以获取类似的问题


我的Symfony动态表单为什么会触发错误事件呢?因为Ajax请求返回了更新后的表单HTML代码! - Arco Voltaico
我返回的是纯文本而不是JSON。 - Brett Mathe

1
检查URL参数,确保与加载的页面相同。您可能正在进行跨域ajax调用。如果您想进行跨域ajax调用,请注意,允许进行跨域请求的数据类型仅为“script”和“jsonp”。在开发环境中遇到此问题,在该环境中,URL是一个IP地址,而页面加载了指向该IP的域名。

0

我知道可能有点晚,但我刚遇到了同样的问题,并且这是谷歌上排名靠前的搜索结果之一。我设法通过将datatype移到url上方来解决它,如下所示:

$.ajax({
    type: 'GET',
    dataType: 'json',
    url: 'http://intern-dev01:50231/api/language',
    success: function() {
        console.log('It Works!');
    },
    error: function (request,status, error) {
        console.log(error);
        alert(status);
    }
});

3
基本上它是一个键值对,所以预先结构化的方式并不重要。我认为构建请求对象的任何东西都不会关注dataType键是在其他键之前还是之后。它只是简单地构造它。这里的目标是找到真正的原因。 - Alexey Shevelyov

0

如果您正在使用不同的Web应用程序和Web API应用程序进行本地测试,则调试应用程序并测试API是否正确发送数据以及应用程序通过AJAX调用API并返回数据。

由于域名不相似,当运行应用程序时,AJAX调用无法命中成功函数。因为浏览器防止跨站点请求。如果您在本地发布并调试两个应用程序,则可以正常工作。

希望这对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接