2014-10-01 3 views
1

Я понимаю, что моя проблема в том, что jQuery пытается разобрать тело ответа как json, но тело не определено и, таким образом, выдает ошибку.Как обрабатывать ответ с неопределенным телом?

Я не могу изменить ответ. Это ответ по умолчанию на серверах Jenkins. Он отправляет 201, 404 или 500 в заголовок, с которым я бы хотел справиться.

мой Аякс:

$(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"); 
    } 
}); 

Несмотря на успешный пост (201 создано), он все равно ударит ошибку из-за синтаксическую ошибку из-за неопределенное тело.

Я бы с удовольствием обработал ошибки в ошибке: часть ajax, но я не могу, чтобы жизнь меня определяла, как получить код состояния из заголовка ответа.

И, как я уже сказал, я бы изменил ответ, если мог, но его как раз как работает Дженкинс.

спасибо.

EDIT: заголовок ответа

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" 
} 
+0

Что заставляет вас думать, JQuery пытается разобрать ответ как JSON? Согласно вашему коду, вы ожидаете «текст» - поэтому тело ответа «неопределенный» не изменит ситуацию. – Adam

+1

'dataType: 'text' означает, что он вообще не будет анализировать ответ. Это оставит его как простую строку. Независимо от вашей ошибки, происходит что-то еще. – Spokey

+0

Я знаю, что jquery обрабатывает его как ошибку, потому что каждый раз появляется предупреждение о сбое. У меня был успех, но он никогда не поп. Если это не ошибка синтаксического анализа, то это что-то еще, больной продолжать исследовать –

ответ

0

Код состояния определяет, какая из функций (т.е. complete, error или success), что jQuery будет срабатывать.

Итак, попробуйте следующее:

$.ajax({ 
    type: 'POST', 
    url: url, 
    dataType: 'text', 
    complete: function(response) { 
     console.log(response); 
    }); 

В будущем это позволит вам отлаживать немного лучше. (Через ваш инспектировать элемент консоли)

Но, код состояния, в этом примере, будет в

response.status

error функция будет стрелять по всему, что не является 200 --- так вы будете лучше с помощью только полной функции, а просто положить свою ошибку в default блоке в switch-case заявления ...

[...] 
complete: function(response){ 
    switch(response.status){ 
     case 201: 
      alert("success" 
     break; 
     default: 
      alert("Something unexpected occurred"); 
     break; 
} 
+0

, когда я это сделать, мой объект ответа выглядит следующим образом: { «readyState»: 0, «Статус»: 0, «его статуса»: «ошибка» } это то же самое независимо от кода состояния заголовка ответа. –

+0

Итак, я добавил точно так же, как вы предлагали ... несмотря на то, что в сетевой консоли все равно 201, он все равно предупреждает инструкцию по умолчанию. response.status = 0 –

+0

Тогда это будет вашей проблемой: http://stackoverflow.com/questions/2000609/jquery-ajax-status-code-0 –

0

Просто используйте обработчик complete - он будет работать после того, как были вызваны success или error. В любом случае, для обоих complete и error первым параметром является объект jqXHR, у которого есть свойство 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 
    } 
}); 
+0

ive попробовал это. проблема в том, что объект xhr не помогает мне. { «readyState»: 0, «status»: 0, «statusText»: «error» } –

0

Если я хорошо значит, и хотите проверить RESPONS от сервера (201, 200, 500): возможно использовать .awlways()

$.ajax({ 
    type: 'POST', 
    url: url, 
    dataType: 'text', 
    always: function(status){ 
     alert(status); 
    } 
}); 

или и можно использовать getAllResponseHeaders() на объект XHR?

+0

по какой-то причине он никогда не переходит в всегда. мне нужно удалить завершение и не получить его туда? –

+0

Теперь вы можете проверить, что ответит u, и определить статус кода возврата u может что-то сделать ... если полная ошибка не работает, попробуйте это – Daredzik

+0

Вы попробовали 'getAllResponseHeaders()' – Daredzik

0

Вы можете иметь конкретные функции обратного вызова для кодов состояния, такие как:

$.ajax({ 
    ... 
    statusCode: { 
    201: function() { /* I received a 201 */ }, 
    404: function() { /* I received a 404 */ }, 
    500: function() { /* I received a 500 */ } 
    } 
}); 

Это указано в the documentation

+0

statusCode вытаскивает из тела, мой не определен. Ive пробовал это, он никогда не ударил их. –

+0

Код состояния ответа = 0 для меня и не изменяется на основе 201 или 404 –

0

Вы можете использовать statusCode

$.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'); 
    }, 
}); 
+0

Ive пробовал это, он никогда не попадает в эти коды состояния. Они вытаскивают statusCode, формируют тело ответа, для которого my undefined. –

+1

Я думаю, что вы можете ввести в заблуждение терминологию, код состояния находится в заголовке ответа (вы показали заголовки, дающие 201), в тексте ответа нет кода состояния. – Adam

+0

Возможно, вы правы, но в любом случае он никогда не оповещает меня. я вижу ответ на консоль, который был создан 201, но он никогда не предупреждает о себе. –

Смежные вопросы