Вызов веб-сервиса через 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(данные);