Вызов веб-сервиса через ajax - правильный ответ в моем обратном вызове
Я пытаюсь получить некоторые данные из веб-службы через ajax, используя следующую функцию,
но я получаю это сообщение:
{"readyState":4, "status":200, "statusText":"load"}
Предполагается, что WS вернет массив json и, если я посмотрю в своем инструменте chrome dev
в сетевой вкладке → Ответ, я действительно получаю правильный массив json.
Вопрос:
- Почему я получаю результат в моем обратном вызове errorFunction?
function callWebService(wsUrl, params, successFunction, errorFunction) {
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader('Access-Control-Allow-Methods', ' GET');
xhr.setRequestHeader("Content-Type",
"application/json; charset=utf-8");
xhr.setRequestHeader("Accept", "application/json");
},
type: "GET",
url: wsUrl,
data: params,
dataType: "json",
contentType: "application/json",
success: successFunction,
error: errorFunction
});
}
Вот мой console.log, когда я использую эту функцию ошибки function(jqXHR, status, error)
*Resource interpreted as Script but transferred with MIME type text/html: "http://www.myweb.it/services/service.php?callback=jQu…y21109160579217132181_1405523828314&codice_istituto=150201&_=1405523828315". jquery.js:8691send jquery.js:8691jQuery.extend.ajax jquery.js:8152callWebService global.js:5(anonymous function) index.js:49jQuery.event.dispatch jquery.js:4409elemData.handle jquery.js:4095
an error occurred: index.js:52
parsererror index.js:53
Error {stack: (...), message: "jQuery21109160579217132181_1405523828314 was not called"}message: "jQuery21109160579217132181_1405523828314 was not called"stack: (...)get stack: function () { [native code] }set stack: function () { [native code] }__proto__: d index.js:54
readyState: 4 index.js:56
jqXHR.status: 200 index.js:57
jqXHR.statusText:load index.js:58
jqXHR.responseText: undefined*
Ответы
Ответ 1
Вы видите обратный вызов error
, потому что что-то не так с вашим запросом AJAX, и оно не возвращается успешно. Определение того, почему это происходит, - это другое дело.
Первый аргумент jQuery для вашего обратного вызова error
- это объект jqXHR:
error
Type: Function( jqXHR jqXHR, String textStatus, String errorThrown )
Это отличается от обратного вызова success
, который начинается с возвращаемого data
:
success
Type: Function( PlainObject data, String textStatus, jqXHR jqXHR )
jqXHR
- это надмножество объекта xmlHttpRequest
JavaScript возвращается. Внутри вы видите readyState
из 4, что просто означает "сделано", а status
из 200 означает успешный запрос. Итак, по крайней мере, вы знаете, что, вероятно, указали свой запрос на правильный URL.
Вы можете получить другую информацию из своего объекта jqXHR
, который может помочь вам определить причину ошибки. Из документов:
Для обратной совместимости с XMLHttpRequest объект jqXHR будет выведите следующие свойства и методы:
-
readyState
-
status
-
statusText
-
responseXML
и/или responseText
, когда базовый запрос ответил xml и/или текстом, соответственно -
setRequestHeader(name, value)
, который отходит от стандарта, заменяя старое значение новым, а не объединяет новое значение со старым. -
getAllResponseHeaders()
-
getResponseHeader()
-
statusCode()
-
abort()
Ответ 2
Этот объект, который вы видите, представляет собой XMLHTTPResponse; представление фактического запроса AJAX. Вы передаете его в обработчик ошибок, потому что что первый аргумент jQuery ajax
обратного вызова ошибки.
Выяснение причин, по которым вызов error
обратного вызова, а не обратного вызова success
сложнее. Что statusText
предполагает, что ваш сервер вернул строку "load" - это возможность? Другая распространенная проблема заключается в том, что ваши данные на самом деле не действительны JSON. JSON довольно придирчивый формат; если вы производите его самостоятельно, у вас могут быть недопустимые пробелы или неправильные кавычки (или полностью отсутствующие кавычки). Проверьте свои данные с помощью инструмента JSONLint и убедитесь, что он действителен и убедитесь, что ваш сервер только возвращает JSON - ничего больше в ответ.
Ответ 3
Просто работайте
1. удалить dataType: 'json'
2. Разбор json при вызове функции успеха data = $.parseJSON(данные);