Ajax请求返回200 OK,但是会引发错误事件而不是成功


805

我已经在我的网站上实现了Ajax请求,并且正在从网页调用端点。它总是返回200 OK,但是jQuery执行error事件。
我尝试了很多事情,但无法弄清问题所在。我在下面添加我的代码:

jQuery代码

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

的C#代码 JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

("Record deleted")成功删除后,我需要该字符串。我可以删除内容,但是没有收到此消息。这是正确的还是我做错了什么?解决此问题的正确方法是什么?


2
您是否可以通过JSON验证程序运行JqueryOperation.aspx的输出并查看其是否有效JSON
parapura rajkumar,2011年

1
jsonlint.com一样。您还必须检查发送的参数。当前您尚未设置任何参数名称。如果参数为TwitterId,则必须将对象传递给data,而不是字符串:data: {TwitterId: row}
菲利克斯·克林

6
Jqueryoperation.aspx页是否返回(有效)JSON?
Salman A

1
可能您的服务器端代码引发了异常..在您的catch块中返回的ru作为响应?
拉加夫

3
@Raghav,如果引发了异常的服务器处理该请求,则HTTP返回代码将是500
StuperUser

Answers:


1118

jQuery.ajax尝试根据指定的dataType参数或Content-Type服务器发送的标头转换响应主体。如果转换失败(例如,如果JSON / XML无效),则会触发错误回调。


您的AJAX代码包含:

dataType: "json"

在这种情况下,jQuery:

将响应评估为JSON并返回一个JavaScript对象。[…] JSON数据以严格的方式进行解析;任何格式错误的JSON都会被拒绝,并引发解析错误。[…]空响应也被拒绝;服务器应返回null或{}的响应。

您的服务器端代码返回带有200 OK状态的HTML代码段。jQuery期望使用有效的JSON,因此会引发抱怨的错误回调parseerror

解决方案是dataType从jQuery代码中删除参数,并使服务器端代码返回:

Content-Type: application/javascript

alert("Record Deleted");

但我宁愿建议返回JSON响应并在成功回调中显示消息:

Content-Type: application/json

{"message": "Record deleted"}

1
感谢您的回复,您能告诉我一件事如何从后面的代码返回json值。我在C#中使用Asp.net。这解决了我的问题,但也请让我知道这件事。
Pankaj Mishra

1
@Pankaj:最好将其作为另一个问题发布。但简短的答案:这样做的两种方法(i)$.ajax可以尝试$.getScript。在服务器端C#脚本内部,只需放置alert('Record Deleted');(不带<script>标签)并将C#脚本的ContentType设置为text/javascript$.ajax也许也可以,但是我不记得怎么了,也许您只是需要更改dataType: 'script',。您可能不再需要成功处理程序。
Salman

3
该答案可能不完整。刚才我在jsonlint.com上验证了JSON,它明确表示这是一个有效的json,但仍使用xhr.status 200触发了“错误”事件。还有什么其他原因?– Ramesh Pareek刚编辑
Ramesh Pareek

2
或者,您也可以删除“ dataType:json”参数
Piero Alberto

1
我在使用时未指定数据类型时也遇到了同样的问题$.post。在这种情况下,jquery会猜测一个数据类型,然后在解析失败时出错。这是一个非常讨厌的,很难找到的陷阱。我通过将数据类型设置为修复了它"text"
Mashmagar '19

31

我通过使用多个以空格分隔的dataTypes(jQuery 1.5+)感到很幸运。如:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

1
类似地,基于JQuery文档,速记字符串(例如“ jsonp xml”)将首先尝试从jsonp转换为xml,然后尝试从jsonp转换为文本,然后从文本转换为xml。因此,它将首先尝试将文本秘密转换为json,如果失败,则将其视为文本?
an IBMer

29

您只需要在AJAX调用中删除dataType:“ json”

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

22

这只是记录,因为我在寻找与OP相似的问题的解决方案时碰到了这篇文章。

就我而言,由于Chrome中的同源策略,我的jQuery Ajax请求被阻止了。当我修改服务器(Node.js)来解决所有问题时:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

从字面上看,我花了一个小时将我的头撞在墙上。我很蠢...


1
谢谢彼得,我遇到了同样的问题,浏览器控制台上的警告消息对我来说很困惑。据我所知,CORS阻止发送请求(使用选项方法协商),在操作完成之后阻止该发送没有意义。也许是自定义浏览器的行为。。我使用Firefox进行了测试。谢谢,您的解决方案解决了我的问题。
danipenaperez

15

我认为您的aspx页面未返回JSON对象。您的页面应执行以下操作(page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

另外,尝试更改您的AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus 应该给你你得到的错误类型。



8

dataType: 'json'如果您实现的Web服务方法无效,则只需从标头中删除即可。

在这种情况下,Ajax调用不会期望具有JSON返回数据类型。


4

使用以下代码来确保响应为JSON格式(PHP版本)...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;


3

我有类似的问题,但是当我尝试删除数据类型:'json'时,我仍然遇到问题。我的错误正在执行而不是成功

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}

我看到了同样的事情。200码的空响应仍在触发错误处理程序。
doublejosh

2

令我感到困惑的另一件事是使用localhost而不是127.0.0.1,反之亦然。显然,JavaScript无法处理彼此之间的请求。


2

看到这个。它也有类似的问题。我试过的工作。

不要删除 dataType: 'JSON',

注意:如果只使用php,则仅在PHP文件中回显JSON Formate。回声ajax代码返回200


1

我有同样的问题。这是因为我的JSON响应包含一些特殊字符,并且服务器文件未使用UTF-8编码,因此Ajax调用认为这不是有效的JSON响应。



-1

您的脚本要求返回JSON数据类型。

尝试这个:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

-9

尝试跟随

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

要么

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

在JSON对象中使用双引号而不是单引号。我认为这将解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.