Данные вставлены успешно, но jquery все еще возвращает ошибку - PullRequest
19 голосов
/ 10 февраля 2010

Я использовал следующий 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"

Ответы [ 6 ]

61 голосов
/ 17 октября 2012

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

11 голосов
/ 11 февраля 2010

Решение:

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

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

спасибо всем

$.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);
            //                }
        });
4 голосов
/ 18 ноября 2016

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

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

$.ajaxSetup({
    dataFilter: function(data, dataType) {
        if (dataType == 'json' && data == '') {
            return null;
        } else {
            return data;
        }
    }
});
2 голосов
/ 14 января 2016

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

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

2 голосов
/ 09 декабря 2014

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

  • PUT по пути именованного ключа (/ rest / properties / mykey1): 204 = Обновлен существующий объект, 201 = Создан новый объект и возвращен заголовок Location, XXX = все остальное, больше всего похожее на ошибку
  • POST к неизвестному ключевому пути (/ rest / properties): 201 = Создан новый объект и возвращен заголовок Location, 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 );
    }
});     
2 голосов
/ 14 июля 2010

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

...