【问题标题】:jQuery not handling JSON response from AJAX POSTjQuery 不处理来自 AJAX POST 的 JSON 响应
【发布时间】:2011-10-14 11:37:27
【问题描述】:

更新:我正在发布 HTML FORM 数据,但希望收到 JSON 数据。我试图发布 JSON 数据。

我正在尝试通过执行 HTML FORM POST 请求来获取 JSON 响应。使用简单的 HTML FORM POST 请求(即不是 AJAX)时,我已成功收到 JSON 回复。我对 HTML FORM POST 的 JSON 响应是这样的:

{"success":true,"data":1234567}

当我尝试使用 jQuery 的 .ajax() 处理请求和响应时,就会出现问题。

$.ajax({
    type: "POST",
    url: URL,
    data: data1,
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
        alert ("success");
    },
    error: function(xhr, status, error) {
        alert ("Error: " + error);
    }
});

在 Firebug 中运行上述代码并调试后,POST 请求似乎正在通过,但响应的处理出现了问题。 Firebug 告诉我有关 POST 请求的 HTTP 响应的以下信息:

Response Headers
Cache-Control   private
Content-Length  31
Content-Type    application/json; charset=utf-8
...

看来这 31 个字节的数据正在被发送。但是,在调试实际的 Javascript 时,会调用错误函数并且 xhr 对象是这样的:

Object { readyState=0, status=0, statusText="error"}

我知道 jQuery.ajax() 文档指出“在 jQuery 1.4 中,JSON 数据以严格的方式解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。”但是,我相信我的 JSON 是有效的,因为我在 jsonlint.com 上进行了检查。

还有什么问题?

【问题讨论】:

  • 尝试将contentType: "application/json; charset=utf-8"添加到$.ajax()
  • var data1 = "apikey="+apikey+"&firstname="+fName+"&lastname="+lName+....... 我知道 data1 不是问题,因为服务器已成功接收数据
  • 添加 contentType: "application/json; charset=utf-8" 会导致 POST 请求无法成功通过服务器。我没有发布 JSON 数据。我正在发布简单的 FORM 数据,但响应是 JSON。

标签: json jquery post response http-post


【解决方案1】:

在我看来,您遇到了服务器错误。我会检查响应的状态代码并修复导致请求在服务器上失败的任何原因。

【讨论】:

  • 使用Firebug,状态码是200,响应头是我上面写的。响应标头显示在 Firebug 的“标头”选项卡中,但“响应”选项卡不显示任何内容。标头表明将有 31 个字节的数据,这是我所期望的。但是,我在 jQuery 代码的成功和错误函数中设置了断点,代码在错误函数中停止,xhr 对象如上图所示。
【解决方案2】:

你得到一个错误,因为 data1 没有以 json 格式格式化,所以当它接收到数据时,它会得到一个解析错误。 data1 需要格式化:

data1={"apikey":apikey,
        "firstname":fName
      }

【讨论】:

  • 我没有发送 JSON。我正在尝试接收 JSON...抱歉,我可能在原帖中没有说清楚。
  • 我明白了,但是你说你的服务器抛出了一个 json 解析错误。
  • 我检查了服务器,它成功接收并存储了我发送的 POST 数据(来自 data1)。您确定 Firebug 调试器中的 xhr 对象为 { readyState=0, status=0, statusText="error"} 是否意味着服务器正在引发 json 解析错误?我认为我的 jQuery .ajax() 代码有问题,而不是服务器。
  • 去掉dataType: "json"这一行,我经常使用ajax但是我从不传递json作为数据类型
  • 可能需要在服务器端定义 {"success":true,"data":1234567} 为对象,然后将对象本身传递给回调。
【解决方案3】:

我遇到了同样的问题。看来这是跨域的问题。

找到这个 SO 答案:https://stackoverflow.com/a/7605563/154513

帮了我。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多