【问题标题】:Ajax call fires error event but returns 200 okAjax 调用触发错误事件但返回 200 ok
【发布时间】:2013-04-20 06:49:50
【问题描述】:
$.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 调用不起作用?如果我在浏览器中调用它可以正常工作:/。

这是提琴手返回的:

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"}]

【问题讨论】:

标签: javascript json api jquery


【解决方案1】:

您必须检查 ajax 响应是否有效。当你在 ajax 中指定时:

dataType: 'json',

如果响应无法解析为 JSON,jQuery 将触发错误事件,即使服务器返回 200 OK。检查从服务器返回的数据,确保它是有效的 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 我得到 parseError
  • @user2314110 只需删除 dataType: 'json' 并尝试。请参阅我的编辑答案。
  • 注意:如果响应为空(例如“”),如果dataType设置为json,$.ajax会报错。正如@BharatChodvadiya 所说,如果您删除它应该可以工作的数据类型。
【解决方案2】:

由于状态显示为 200 OK,因此出现解析错误。问题在于数据类型:json。要对此进行测试,请删除该行,它应该可以工作。为了解决这个问题,您可以将其更改为数据类型:文本。 See this link too for similar question

【讨论】:

  • 这就是我的 Symfony 动态表单触发错误事件的原因,因为 ajax 请求返回我更新表单的 html !!!
  • 我返回的是纯文本而不是 json。
【解决方案3】:

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

因为在运行应用程序 AJAX 调用时域不相似,因此未命中成功函数。因为浏览器阻止了Cross Site request。如果您在 local 和 debug 中发布这两个应用程序,则可以正常工作。

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

【讨论】:

    【解决方案4】:

    检查 url 参数并确保它与加载的页面相同。您可能正在执行跨域 ajax 调用。如果您想进行跨域 ajax 调用,请注意允许进行跨域请求的唯一数据类型是“script”和“jsonp”。

    在 URL 是 IP 地址并且页面加载了指向该 ip 的域名的开发环境中遇到了这个问题。

    【讨论】:

      【解决方案5】:

      我知道我来晚了,但我遇到了同样的问题,这是 Google 上的热门搜索结果之一。我设法通过在 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);
          }
      });
      

      【讨论】:

      • 它基本上是一个键值对,因此它的预结构化方式并不重要。如果 dataType 键在其他键之前或之后,我认为构建此请求对象的任何内容都不会查看。它只是构造它。这里的目标是找到真正的原因。
      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2021-09-10
      相关资源
      最近更新 更多