Данные вставлены успешно, но jquery все еще возвращает ошибку

Я использовал следующий jQuery для вставки данных через службу данных. Событие, хотя я получил статус-ответ 201 и данные успешно вставлены в мою базу данных, система по-прежнему считает это ошибкой и выдает мне предупреждение «сбой»?

Что мне здесь не хватает?

$.ajax({
    type: "POST",
    url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/",
    data: JSON.stringify(record),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function() {
        alert("Success");
    },
    error: function(xhr) {
        alert("fail");
    }
});

ОБНОВЛЕНИЕ:

Отладочное сообщение от Fire Bug:

Preferences

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

jquery....min.js (line 127)
POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created 6.7s

POST http://localhost:49223/Form/WebDataService.svc/X...ef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

POST http://localhost:49223/Form/WebDataService.svc/XMLForm(guid%271eaef3a0-d6df-45bf-a8f6-3e7292c0d77e%27)/XMLRecord/

201 Created


get readyState 4

get responseText "{ "d" : {\r\n"__metadata"...\')/XMLForm"\r\n}\r\n}\r\n} }"

get responseXML null

get status 201

get statusText "Created"

person D.J    schedule 10.02.2010    source источник
comment
Попробуйте использовать Firebug для просмотра http-ответа сервера. Это может сказать вам, почему это терпит неудачу.   -  person tbreffni    schedule 11.02.2010
comment
Не могли бы вы посоветовать мне, где искать, я новичок в использовании ADO.Net в Ajax. Я использовал firebugs, однако я не нашел там никакой ошибки. Я обновил лог от fireBug   -  person D.J    schedule 11.02.2010
comment
Странный. Насколько я вижу, 201 считается успешным в JQuery.   -  person Pekka    schedule 11.02.2010
comment
Я получил то же самое. 201 как не удалось, это странно   -  person heffaklump    schedule 06.07.2010


Ответы (6)


Вы должны отправить { dataType: 'text' }, чтобы функция успеха работала с jQuery и пустыми ответами.

person Ruben Stolk    schedule 17.10.2012
comment
Спасибо - у меня был dataType: json, и я был сбит с толку этим. - person Neil Thompson; 17.05.2013
comment
Работал и для меня. Я потратил на это дни! Интересно, почему это так. - person sshirley; 12.06.2014
comment
Если вы посмотрите на источник github.com/jquery/jquery/ blob/master/src/ajax.js#L706 - jquery проверяет, является ли статус сначала 204, затем, если это 304, в противном случае он пытается использовать результат запуска ответа через конвертер... Конвертер JSON выдает исключение, по-видимому, для пустой строки/отсутствия содержимого, которое возвращает ошибку, даже если статус является успешным. Предполагая, что с текстовым преобразователем у jQuery нет проблем с разбором пустого тела ответа. Похоже на глупый взлом - и, возможно, jQuery не работает так, как ожидалось в этом сценарии. - person Mark G.; 30.09.2014
comment
Это сработало и для меня, хотя я отправляю Content (Success, application/json), но изменение dataType: text заставило все работать. - person Zafar; 06.04.2017
comment
Хорошо, 2018 год, и это решение самое креативное и простое! Спасибо. - person Burhan Kashour; 15.05.2018

Решение:

хотя я до сих пор не могу понять, как я получаю ошибку из предыдущего кода, я получил это альтернативное решение, которое работает для меня. (по крайней мере на данный момент).

хотелось бы услышать больше идей

Спасибо вам всем

$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: "http://localhost:49223/Form/WebDataService.svc/XMLForm(guid'1eaef3a0-d6df-45bf-a8f6-3e7292c0d77e')/XMLRecord/",
            data: JSON.stringify(record),
            complete: function(xhr) {
                if (xhr.readyState == 4) {
                    if (xhr.status == 201) {
                        alert("Created");
                    }
                } else {
                    alert("NoGood");
                }
            }
            //                
            //                success: function(data) {
            //                    alert("Success");
            //                },
            //                error: function(xhr) {
            //                    alert("fail" + xhr);
            //                }
        });
person D.J    schedule 11.02.2010
comment
У меня тоже была такая же проблема .... Оказалось, что YourParadigm сказал ниже .... - person postalservice14; 20.12.2011
comment
У меня точно такая же проблема. Странно, что какое-то время работало. Затем к вызовам службы был добавлен собственный заголовок, и с тех пор я не мог использовать атрибут успеха. Теперь настоящая хитрость заключается в том, чтобы передать пользовательскую функцию для успеха и не выполнять проверку xhr.readystate в каждой функции. - person Chris; 26.07.2012
comment
Это не должен быть принятый ответ, поскольку это решение практически обходит сообщение об ошибке, передавая его вручную. ИМО, принятый ответ должен быть ответом Рубена Столка. - person leojh; 13.09.2013

Это происходит не потому, что 201 без содержимого обязательно считается недействительным, а потому, что синтаксический анализ пустой строки ("") является ошибкой синтаксического анализа JSON.

Это поведение можно изменить глобально или для каждого запроса, установив dataFilter.

$.ajaxSetup({
    dataFilter: function(data, dataType) {
        if (dataType == 'json' && data == '') {
            return null;
        } else {
            return data;
        }
    }
});
person Steve    schedule 17.11.2016

У меня это случилось со мной ранее. Моя проблема заключалась в том, что в конце строки запроса не было расширения «.json», поэтому я возвращал XML. jQuery захлебнулся при попытке разобрать xml как json, что привело к вызову обработчика ошибок.

person YourParadigm    schedule 13.07.2010
comment
У меня есть строка запроса, выглядящая так: /self-service/api/v1/user/ - добавление ?format=json в конец не работает, хотя это заставит API веб-службы возвращать json, а не xml. - person henrikstroem; 20.08.2013

Я использую jQuery_2.1.1, и у меня была похожая проблема. PUT перешел к обработчику error(). Мой принцип вызова API REST

  • PUT к именованному ключевому пути (/rest/properties/mykey1): 204=обновлен существующий объект, 201=создан новый объект и возвращен заголовок Location, XXX=все остальное, наиболее похожее на ошибку
  • POST для неизвестного ключевого пути (/rest/properties): 201 = Создан новый объект и возвращен заголовок Location, XXX = что-то еще, что больше всего похоже на ошибку

Статус Http 204 — NoContent, поэтому с jQuery все в порядке, но 201 = Created ожидал объект тела json, но я вернул часть тела нулевой длины. Адрес ресурса был указан в заголовке ответа о местоположении.

Я могу вернуть объект json в зависимости от нескольких угловых случаев, поэтому мне пришлось использовать атрибут datatype: "json". Моим решением jQuery была проверка error() на статус 201 и вызов функции success().

$.ajax({
    url: "/myapp/rest/properties/mykey1",
    data: jsonObj, 
    type: "PUT",
    headers: { "Accept":"application/json", "Content-Type":"application/json" },
    timeout: 30000,
    dataType: "json",
    success: function(data, textStatus, xhr) {
        data="Server returned " + xhr.status;
        if (xhr.status==201) data+=" "+xhr.getResponseHeader("location");
        $("#ajaxreply").text(data);
    },
    error: function(xhr, textStatus, ex) {
        if (xhr.status==201) { this.success(null, "Created", xhr); return; }
        $("#ajaxreply").text( textStatus + "," + ex + "," + xhr.responseText );
    }
});     
person Whome    schedule 09.12.2014

Я ответил на это в другой подобной теме:

У меня была та же проблема, и одна вещь, которая решила ее для меня, - оставить «dataType» неустановленным. Когда вы сделаете это, jQuery попытается угадать тип данных, возвращаемый сервером, и не выдаст ошибку, когда ваш сервер вернет 201 без содержимого.

person Herberth Amaral    schedule 14.01.2016