【问题标题】:Ajax request fails, can't see whyAjax 请求失败,不知道为什么
【发布时间】:2012-12-15 13:17:23
【问题描述】:

我创建了一个以 json 格式返回数据的 API,现在我正在创建一个应用程序来通过接收数据并在页面上使用它来测试 API。但是,我的 ajax 代码(见下文)由于某种原因失败了,错误只是“错误”(错误:错误)。

代码有什么问题?

代码:

    $.ajaxSetup ({
      url: "http://localhost:8000/products", // <--- returns json
      type: "GET",
      headers:{
        "Accept":"application/json",
        "Content-type":"application/x-www-form-urlencoded"
      }
    })
    $.ajax({
        success: function(data){
            console.log("You made it!");
        },
        error: function(xhr) {
           console.log("Error: " + xhr.statusText);
       }
    }).done(function(data){
        console.log(data);
    })

这是我在 Chrome (Inspector -> Network) 中获得的信息:

名称: 产品 localhost/,方法: GET,状态:(已取消),类型: 待定, Initiator: jquery-latest.js:8434 Script, Size: 13B 0B, Time: 95ms 0.0 days

【问题讨论】:

  • 你是成功了还是完成了。
  • @Jai:他们都没有,我得到了错误。
  • 还有一件事是 url 返回 json 编码的数据。
  • @holyredbeard:您能否查看一下名为“网络”的 Chrome 开发人员工具选项卡并将调用结果粘贴到此处?我怀疑服务器响应可能是问题所在。另外,您是否按照 Pavel Hodek 在his answer 中的建议取消了请求?
  • @Tadeck:当然。我将使用此信息更新我的问题!

标签: jquery ajax api get request


【解决方案1】:

可能是什么问题

我想我知道你的问题。看起来你正在加载一个页面,一些协议+域+端口(例如“http://localhost/”),但随后调用 AJAX 请求到不同的协议、域或端口(在这种情况下可能只有端口不同:“http://localhost:8000/products") .

这样您可能会遇到Same Origin Policy 限制,这是您浏览器的安全功能。在这种情况下,浏览器可能会指示特定请求已被“取消”(因为浏览器阻止了它)。

解决方案

您的问题有多种解决方案:

  • (最简单)为原始站点和 AJAX 请求的端点坚持相同的协议+域+端口,
  • (第二个最简单的)在服务器上构建一个端点,例如。 “http://localhost/products”将在后台调用“http://localhost:8000/products”并返回其响应(作为 SOP 的预演),
  • 一些更复杂的解决方案,如 JSONP、CORS 等(更多信息请参见:https://stackoverflow.com/a/8467697/548696),

【讨论】:

    【解决方案2】:
    $.ajax({
        /* ajax options omitted */
        error: function (xmlHttpRequest, textStatus, errorThrown) {
             if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) 
                  return;  // it's not really an error
             else
                  // Do normal error handling
    });
    

    【讨论】:

    • 想解释一下你的答案吗?
    • 当您在完成之前取消 ajax 请求,或者当您导航到另一个页面或刷新页面时,可能会出现 status 或 readyState == 0 错误。您可以从第一个或第三个参数获取错误的详细信息 - 尝试使用 console.log(...) 将它们记录到控制台以查看会发生什么。
    • @PavelHodek:我试过你的代码,readyState 和状态是 0,所以我想没有“真正的”错误?
    • @holyredbeard 我认为没有错误。还可以尝试使用 Firebug(Firefox 扩展)或 Fiddler 或 Chrome 中的开发人员工具检查响应 - 您可以在那里查看哪些数据作为响应发送。如果一切正常且数据正常,则不会发生错误。
    • @holyredbeard 有 Net 选项卡,其中有 XHR 选项卡 - 您可以在其中查看当前页面的所有 Ajax 请求和响应(url、内容、标题等)。您也可以使用 Firebug 调试 JavaScript,只需在 Firebug 中的 JavaScript 源代码中放置断点(选项卡脚本) - 在那里您可以查看任何对象信息。
    【解决方案3】:

    尝试只使用

    $.ajax({
      url: "http://localhost:8000/products", 
      dataType: 'json',
      success: function(data){
                console.log("You made it!");
            },
            error: function(xhr) {
               console.log("Error: " + xhr.statusText);
           }
    });
    

    您可以在成功或完成回调中使用代码行,而不是使用完成回调。它非常简单和干净。

    【讨论】:

    • 谢谢,我同意它更干净。虽然问题仍然存在 - 引发的错误。
    【解决方案4】:

    为什么不尝试将两个 ajax 调用合并为一个。并尝试更改type = "POST"

    $.ajax({
        type: "POST",
        url: "http://localhost:8000/products",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        error: function(errMsg) {
            alert(errMsg);
        }
    });
    

    【讨论】:

    • "两个 ajax 调用合二为一"?只有一个电话。如果您正在谈论调用$.ajaxSetup(),那么也许 OP 想在将来使用它(例如通过应用 DRY 原则来简化代码)。
    • @Tadeck:谢谢你的信息。我不知道 :)
    • BTW $.ajaxSetup() 不进行任何 ajax 调用,它只是 ajax 模块的设置。
    【解决方案5】:

    我认为您的浏览器缓存了错误,或者可能在正确设置标头时出现问题,因此请尝试在$.ajaxsetup()中添加这种方式:

        $.ajaxSetup ({
          url: "http://localhost:8000/products", // <--- returns json
          type: "GET",
          dataType: 'json',
          cache: false,
          contentType: "application/json"
        });
    

    尝试这种方式一次,看看是否有效。

    【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2017-04-24
    • 2014-04-08
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多