Javascript 如何处理未定义主体的响应?
我知道我的问题是jQuery试图将响应的主体解析为json,但主体未定义,因此会抛出错误 我不能改变回答。这是Jenkins服务器的默认响应。它在报头中发送一个201、404或500,我想处理它 我的ajax:Javascript 如何处理未定义主体的响应?,javascript,jquery,html,ajax,post,Javascript,Jquery,Html,Ajax,Post,我知道我的问题是jQuery试图将响应的主体解析为json,但主体未定义,因此会抛出错误 我不能改变回答。这是Jenkins服务器的默认响应。它在报头中发送一个201、404或500,我想处理它 我的ajax: $(document).ready(function () { $('#reviewForm').bootstrapValidator({ ...stuff... ...validation... }) .on('success.form.bv
$(document).ready(function () {
$('#reviewForm').bootstrapValidator({
...stuff...
...validation...
})
.on('success.form.bv', function (e) {
// Prevent form submission
e.preventDefault();
// Get the form instance
var $form = $(e.target);
// Use Ajax to submit form data
$.ajax({
type: 'POST',
url: url+$form.serialize(),
dataType: 'text',
complete: function() {
alert("Success.");
},
error: function(xhr, status, text) {
alert("failure");
}
});
尽管成功创建了post 201,但由于未定义的主体导致语法错误,它仍然会遇到错误
我很乐意处理error:ajax的一部分中的错误,但我一辈子都不知道如何从响应的头中获取状态代码
$.ajax({
type: 'POST',
url: url,
dataType: 'text',
complete: function(xhr) {
//this handler runs regardless of success or error
//query xhr.status for the response code
}
});
就像我说的,如果可以的话,我会改变回答,但詹金斯就是这样工作的
多谢各位
编辑:响应标题
Status Code: 201 Created
Connection: Keep-Alive
Content-Type: text/plain; charset=UTF-8
Date: Wed, 01 Oct 2014 14:51:12 GMT
Keep-Alive: timeout=15, max=100
Location: https://jenkins....
Server: Jetty(8.y.z-SNAPSHOT)
Transfer-Encoding: chunked
这是xhr xml http响应
{
"readyState": 0,
"status": 0,
"statusText": "error"
}
状态代码决定jQuery将触发哪些函数,即complete、error或success 那么,试试这个:
$.ajax({
type: 'POST',
url: url,
dataType: 'text',
complete: function(response) {
console.log(response);
});
在将来,这将允许您更好地调试。通过您的检查元素控制台
但是,在本例中,状态代码为
答复.状态
error函数将触发任何不是200的函数,因此最好只使用完整函数,只需将错误放在switch case语句的默认块中
[...]
complete: function(response){
switch(response.status){
case 201:
alert("success"
break;
default:
alert("Something unexpected occurred");
break;
}
只需使用完整的处理程序-它将在调用成功或错误后运行。不管是哪种方式,对于complete还是error,第一个参数都是一个对象,它有一个status属性,可以为您提供响应的状态
$.ajax({
type: 'POST',
url: url,
dataType: 'text',
complete: function(xhr) {
//this handler runs regardless of success or error
//query xhr.status for the response code
}
});
如果我是认真的,你想检查服务器201、200、500的响应: 也许用吧,一直用
或者您可以在xhr对象上使用getAllResponseHeaders?您可以对状态代码进行特定回调,例如:
$.ajax({
...
statusCode: {
201: function() { /* I received a 201 */ },
404: function() { /* I received a 404 */ },
500: function() { /* I received a 500 */ }
}
});
这列在中。您可以使用状态代码
是什么让您认为jQuery试图将响应解析为JSON?根据您的代码,您需要的是文本,因此未定义的响应体不会产生任何影响。数据类型:“text”表示它根本不会解析响应。它将保留为一个简单的字符串。无论您的错误是什么,都是来自其他方面。我知道jquery会将其作为错误处理,因为我的失败警报每次都会弹出。我有一个成功的改变在那里,但它永远不会弹出。如果不是解析错误,那是另外一种情况,我会继续在帖子中调查您的代码,您应该会看到失败和成功警报,因为完整的回调将在出现错误后运行。@JamesThorpe是的,我收到了这些警报。我试过了,它从未命中这些状态代码。我想你可能会混淆术语,状态代码在响应的标题中,你显示的标题给出了201,响应的主体中没有状态代码。你可能是对的,但无论如何,它都不会提醒我。我可以看到控制台中正在创建201响应,但它从未为我提醒201。我已从以前的代码中删除了数据。如果警报来了,试试看。@kum在那里也不走运。我的问题是,对于我的所有响应,response.status=0。然而,当我观看网络控制台时,我可以看到状态代码实际上应该是201和404。状态代码来自身体,我的是未定义的。我尝试过这个,但它从未命中这些。我的响应状态代码为0,并且不会根据201或404更改。当我这样做时,我的响应对象看起来如下:{readyState:0,status:0,statusText:error}不管响应头的状态代码如何,这都是一样的。所以我完全按照您的建议添加了…尽管在网络控制台中看到一个201完成,它仍然会提醒默认语句。response.status=0然后这将是您的问题:出于某种原因,它永远不会进入“始终”。我需要删除完整的和失败的,让它去那里吗?现在你可以检查你的反应,并确定返回代码的状态,你可以做些什么。。。如果“完成/错误”不起作用,请尝试此操作。是否尝试GetAllResponseHeader已尝试此操作。问题是xhr对象对我没有帮助。{readyState:0,状态:0,状态文本:错误}
$.ajax({
type: 'POST',
url: url,
statusCode: {
200: function (response) {
alert('200');
},
201: function (response) {
alert('201');
},
404: function (response) {
alert('400');
}
}, success: function () {
alert('Success');
},
});