关于javascript:Ajax请求返回200 OK,但是触发了错误事件而不是成功

Ajax request returns 200 OK, but an error event is fired instead of success

我在我的网站上实现了一个Ajax请求,我从一个网页调用端点。它总是返回200OK,但jQuery执行错误事件。我试了很多东西,但没能找出问题所在。我在下面添加我的代码:

jQuery代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
}

JqueryOpeartion.aspx的C代码

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

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


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

Ajax代码包含:

1
dataType:"json"

在这种情况下,jquery:

Evaluates the response as JSON and returns a JavaScript object. […]
The JSON data is parsed in a strict manner; any malformed JSON is
rejected and a parse error is thrown. […] an empty response is also
rejected; the server should return a response of null or {} instead.

服务器端代码返回具有200 OK状态的HTML代码段。jquery需要有效的JSON,因此会引发错误回调,抱怨parseerror

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

1
2
3
Content-Type: application/javascript

alert("Record Deleted");

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

1
2
3
Content-Type: application/json

{"message":"Record deleted"}


您只需在Ajax调用中删除数据类型:"json"。

1
2
3
4
5
6
7
8
9
10
$.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
});


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

在我的例子中,由于chrome中的相同源站策略,jquery-ajax请求无法成功。当我将服务器(node.js)修改为:

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

我的头撞在墙上花了一个小时。我觉得自己很傻…


我认为您的ASPX页面不会返回JSON对象。您的页面应该这样做(页面加载)

1
2
3
4
var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

另外,尝试更改AjaxFailed:

1
2
3
function AjaxFailed (XMLHttpRequest, textStatus) {

}

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


我在更新的jquery库中遇到了这个问题。如果服务方法不返回任何内容,则表示返回类型为void

然后在你的Ajax电话中,请提到dataType='text'

它将解决问题。


如果实现的Web服务方法无效,则只需从头部删除dataType: 'json'

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


我也有同样的问题。我的问题是我的控制器返回了一个状态代码而不是JSON。确保控制器返回如下内容:

1
2
3
4
public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

我也有类似的问题,但是当我试图删除数据类型时:'json'我还是有问题。我的错误是执行而不是成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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); }
    });
}


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

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

另一件让我搞砸的事情是用localhost代替127.0.0.1,反之亦然。显然,javascript不能处理从一个到另一个的请求。


看到这个了。这也是类似的问题。我试过了。

不要拆下dataType: 'JSON',

注意:如果只使用php echo,则只在php文件中回送json-formate,Ajax代码返回200


如果您总是从服务器返回JSON(没有空响应),那么dataType: 'json'应该可以工作,不需要contentType。但是,请确保JSON输出…

  • 有效(jsonlint)
  • 已序列化(jsonminify)

jquery-ajax将在有效但未序列化的json上抛出"parserror"!


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


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

试试这个:

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

尝试跟随

1
2
3
4
5
6
7
8
9
10
11
$.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
});

1
2
3
4
5
6
7
8
9
$.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对象中使用双引号而不是单引号。我认为这将解决这个问题。