Подтвердить что ты не робот

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

Я использовал следующий jQuery для вставки данных через Data Service. Событие, хотя я получил статус-ответ 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");
    }
});

UPDATE:

Отладочное сообщение из 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"
4b9b3361

Ответ 1

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

Ответ 2

Решение:

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

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

Благодарю вас всех

$.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);
            //                }
        });

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

Я ответил на другой похожий поток:

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