jQuery无法处理来自AJAX POST的JSON响应

4

更新时间:我正在提交HTML FORM数据,但期望接收JSON数据。我并没有尝试POST 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上检查过了。
可能出了什么问题?

尝试在 $.ajax() 中添加 contentType: "application/json; charset=utf-8" - Mrchief
var data1 = "apikey="+apikey+"&firstname="+fName+"&lastname="+lName+....... 我知道data1不是问题,因为服务器成功接收了数据。 - t2k32316
添加contentType: "application/json; charset=utf-8"会导致POST请求无法成功发送到服务器。我不是在POST JSON数据,而是POST简单的表单数据,但响应是JSON格式的。 - t2k32316
4个回答

1

看起来你遇到了服务器错误。我会检查响应的状态码并修复导致请求在服务器上失败的任何问题。


使用Firebug,状态码为200,并且响应头部与我之前所写的一样。响应头部会在Firebug的“Headers”选项卡中显示,但是“Response”选项卡却没有任何内容。头部指示将会有31字节的数据,这正是我所期望的。然而,我在jQuery代码的成功和错误函数中设置了断点,代码在错误函数中停止执行,并且xhr对象与我在原始帖子中所展示的一样。 - t2k32316

0

0

你之所以会收到错误信息,是因为data1没有按照json格式进行编排,因此当它接收到数据时就会出现解析错误。需要对data1进行格式化处理:

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

我不是在发送JSON,我正在尝试接收JSON...抱歉,也许我在原始帖子中表达不清楚。 - t2k32316
我理解,但您说您的服务器出现了JSON解析错误。 - Johnny Craig
我已经检查了服务器,并成功接收和存储了我发送的POST数据(来自data1)。你确定在Firebug调试器中xhr对象为{readyState=0,status=0,statusText="error"}意味着服务器抛出了json解析错误吗?我认为我的jQuery .ajax()代码有问题,而不是服务器。 - t2k32316
1
去掉这一行:dataType: "json",我经常使用ajax,但从未将json作为数据类型传递。 - Johnny Craig
可能需要在服务器端将 {"success":true,"data":1234567} 定义为一个对象,然后将该对象本身传递给回调函数。 - Johnny Craig
去掉dataType: "json"这一行会得到相同的结果。不幸的是,我现在无法修改服务器端代码... - t2k32316

0

有时候Jquery会返回内部错误500,即使数据是正确的。

以下是读取相同JSON数据而不出现错误的示例:

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://reqres.in/api/products/3", true);
xhr.onload = function(){
    console.log(xhr.responseText);
};
xhr.send();

在后端输出结果后,请检查是否有错误符号。 - Nikita Jurievich Nickemail

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