обработчик успеха для функции $ .ajax с нестандартным кодом статуса http - PullRequest
9 голосов
/ 18 июня 2010

Мы написали серверный API RESTful.По какой-то причине мы приняли решение, что для DELETE мы хотели бы вернуть код состояния 204 (без содержимого) с пустым ответом.Я пытаюсь вызвать это из jQuery, передавая обработчик успеха и устанавливая глагол DELETE:

jQuery.ajax({
    type:'DELETE',
    url: url,
    success: callback,
});

Сервер возвращает 204, но обработчик успеха никогда не вызывается.Есть ли способ, которым я могу настроить jQuery, чтобы разрешить 204 с запускать обработчик успеха?

Ответы [ 5 ]

11 голосов
/ 18 июня 2010

204 следует рассматривать как успех. Какую версию jQuery вы используете? Я сделал пару тестов, и все 200 кодов состояния диапазона были переданы обработчику успеха. Источник для jQuery 1.4.2 подтверждает это:

// Determines if an XMLHttpRequest was successful or not
httpSuccess: function( xhr ) {
    try {
        // IE error sometimes returns 1223 when 
        // it should be 204 so treat it as success, see #1450
        return !xhr.status && location.protocol === "file:" ||
            // Opera returns 0 when status is 304
            ( xhr.status >= 200 && xhr.status < 300 ) ||
            xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
    } catch(e) {}

    return false;
},
9 голосов
/ 23 октября 2012

У меня была проблема с simliar, потому что мой скрипт также отправлял заголовок «Content-Type» как «application / json».Хотя запрос был выполнен успешно, он не смог JSON.parse пустая строка.

3 голосов
/ 19 марта 2013

Это технически проблема на вашем сервере Как сказал Пол, пустой ответ 204 с типом содержимого сервера json обрабатывается jQuery как ошибка. Вы можете обойти это в jQuery, вручную переопределив dataType на 'text'.

$.ajax({
    url: url,
    dataType:'text',
    success:(data){
       //I will now fire on 204 status with empty content
       //I have beaten the machine.
    }
});
3 голосов
/ 18 июня 2010
jQuery.ajax({
    ...
    error: function(xhr, errorText) {
        if(xhr.status==204) successCallback(null, errorText, xhr);
        ...
    },
    ...
});

некрасиво ... но может помочь

2 голосов
/ 22 апреля 2013

Это альтернативный способ обратного вызова при успехе ... Я думаю, что это сработает для вас.

$.ajax({
    url: url,
    dataType:'text',
    statusCode: {
                204: function (data) {
                   logic here
                }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...