Ответ 1
Вам нужно отправить {dataType: 'text'}, чтобы функция успеха работала с 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"
Вам нужно отправить {dataType: 'text'}, чтобы функция успеха работала с jQuery и пустым ответом.
Решение:
хотя я все еще не могу понять, как я получаю ошибку из предыдущего кода, у меня есть это альтернативное решение, которое работает для меня. (по крайней мере на данный момент).
хотел бы услышать больше идей
Благодарю вас всех
$.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);
// }
});
Это происходит не потому, что 201 без содержимого обязательно считается недопустимым, но поскольку синтаксический анализ пустой строки ("") является ошибкой разбора JSON.
Это поведение можно изменить глобально или по запросу, установив dataFilter.
$.ajaxSetup({
dataFilter: function(data, dataType) {
if (dataType == 'json' && data == '') {
return null;
} else {
return data;
}
}
});
У меня это случилось со мной раньше. Моя проблема не включала расширение ".json" в конце строки запроса, поэтому я возвращал XML. jQuery задохнулся при попытке проанализировать xml как json, в результате чего обработчик ошибок получил вызов.
Я использую jQuery_2.1.1 и с аналогичной проблемой PUT обратился к обработчику error(). Мой главный вызов REST api
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 );
}
});
Я ответил на другой похожий поток:
У меня была такая же проблема, и одна вещь, которая разрешила это для меня, оставила "dataType" незавершенной. Когда вы это сделаете, jQuery попытается угадать тип данных, который возвращает сервер, и не будет вызывать ошибку, когда ваш сервер вернет 201 без содержимого.