2010-02-10 4 views
17

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

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

$.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:

Debug Сообщение от огня Буг:

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" 
+1

Попробуйте использовать Firebug для просмотра ответа HTTP с сервера. Это может сказать вам, почему это неудачно. – tbreffni

+0

Не могли бы вы посоветовать мне, где искать, я новичок в использовании ADO.Net в Ajax. Я использовал firebugs, но я не нашел там никакой ошибки. Я обновил журнал из fireBug –

+0

Странно. Насколько я понимаю, '201' считается успешным в JQuery. –

ответ

57

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

+2

Спасибо. У меня был dataType: «json» и был озадачен этим. –

+0

Работал для меня тоже. Я потратил на это дни! Интересно, почему это так. – sshirley

+7

Если вы посмотрите на источник https://github.com/jquery/jquery/blob/master/src/ajax.js#L706 - jquery проверяет, является ли статус первым 204, тогда, если это 304, в противном случае это пытается использовать результат выполнения ответа через конвертер ... Конвертер JSON генерирует исключение, по-видимому, на пустой строке/без содержимого, которая возвращает ошибку, даже если статус имеет успех. Предполагая, что с конвертером текста jQuery не имеет проблем с анализом пустого тела ответа. Кажется, что это глупый взлом - и, возможно, jQuery не действует так, как ожидалось в этом сценарии. –

8

Решение:

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

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

спасибо всем

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

У меня также была такая же проблема .... Оказалось, что «YourParadigm» сказал ниже .... – postalservice14

+0

У меня точно такая же проблема. Странно, что он работал некоторое время. Затем к вызовам службы был добавлен пользовательский заголовок, и с тех пор мне не удалось использовать атрибут «success». Теперь реальный трюк состоит в том, чтобы передать пользовательскую функцию для успеха и не выполнять проверку xhr.readystate в каждой функции. – Chris

+0

Это не должно быть принятым ответом, так как это решение практически обходит сообщение об ошибке, передавая его вручную. ИМО, принятым ответом должен быть Рубен Штольк. – leojh

2

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

+0

У меня есть строка запроса, выглядящая так: '/ self-service/api/v1/user /' - добавление '? Format = json' до конца не работает, даже если это заставит веб-службу api возвратить json скорее чем xml. – henrikstroem

2

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

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

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

Я могу вернуть объект json в зависимости от нескольких угловых шкафов, поэтому пришлось использовать тип данных: атрибут «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

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

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

4

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

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

$.ajaxSetup({ 
    dataFilter: function(data, dataType) { 
     if (dataType == 'json' && data == '') { 
      return null; 
     } else { 
      return data; 
     } 
    } 
}); 
Смежные вопросы