Обработка ошибок запроса JSONP

Я делаю запрос ajax jsonp, но обработка ошибок сбоя не будет работать. Если запрос 404 или 500, он не будет обрабатывать ошибку.

Я искал вокруг, чтобы найти ответ на это, но ничего не могу найти. Кажется, есть решение с http://code.google.com/p/jquery-jsonp/, но я не могу найти примеров того, как его использовать.

function authenticate(user, pass) {       
    $.ajax ({
        type: "POST",
        url: "url",
        dataType: 'jsonp',
        async: false,
        //json object to sent to the authentication url
        data: {"u": userid, "p": pass},

        success: function (data) {
            //successful authentication here
            console.log(data);
        },
        error: function(XHR, textStatus, errorThrown) {
            alert("error: " + textStatus);
            alert("error: " + errorThrown);
        }
    })
}

5 ответов


два способа обработки ошибок

  1. нет обработки ошибок для междоменных запросов JSONP. Используйте плагин jsonp, доступный на Github https://github.com/jaubourg/jquery-jsonp это обеспечивает поддержку для обработки ошибок.

  2. jQuery ajax Timeout-тайм-аут после разумного количества времени, чтобы запустить обратный вызов ошибки, потому что он мог бы потерпеть неудачу молча. Вы можете не знать, какая фактическая ошибка (или состояние ошибки) была, но в по крайней мере, вы можете справиться с ошибкой


если вы проверяете С помощью jQuery."Аякс" () документация, вы можете найти:

функция, вызываемая при сбое запроса (...) Примечание: этот обработчик не вызывается для междоменных сценариев и междоменных запросов JSONP. Это событие Ajax.

из-за этого, вам придется найти обходной путь. Вы можете указать timeout для запуска обратного вызова ошибки. Это значит, что внутри указанный срок запрос должен быть успешно завершен. В противном случае предположим, что это не удалось:

$.ajax({
    ...
    timeout: 5000, // a lot of time for the request to be successfully completed
    ...
    error: function(x, t, m) {
        if(t==="timeout") {
            // something went wrong (handle it)
        }
    }

});

другие проблемы в коде...

пока JSONP (посмотри здесь и здесь) может использоваться для преодоления ограничения политики происхождения, вы не можете публиковать с помощью JSONP (см. CORS а) потому что это просто не работает - он создает элемент для извлечения данных, что должно быть сделано с помощью GET запрос. Решение JSONP не использует объект XmlHttpRequest, поэтому он не является запросом AJAX в стандартном понимании, но к содержимому по - прежнему обращаются динамически-никакой разницы для конечного пользователя.

$.ajax({
    url: url,
    type: "GET"
    dataType: "jsonp",
    ...

во-вторых, вы предоставляете неправильно данные. Вы нажимаете объект javascript (созданный с использованием объектных литералов) на провод вместо его сериализованного представления JSON. Создайте строку JSON (не вручную, используйте, например,JSON.stringify конвертер):

$.ajax({
    ...
    data: JSON.stringify({u: userid, p: pass}),
    ...

последние вопрос, вы установили async до false, в то время как документация говорит:

междоменные запросы и тип данных: запросы" jsonp " не поддерживают синхронная работа.


Я боролся, как и вы, некоторое время, пытаясь обрабатывать ошибки в запросах типа данных ajax jsonp, однако я хочу поделиться с вами своим кодом, надеюсь, это поможет. Главное - включить тайм-аут в запрос ajax, иначе он никогда не будет вводить ошибку: function

$.ajax({
url: "google.com/api/doesnotexists",
dataType: "jsonp",
timeout: 5000,

success: function (parsed_json) {
console.log(parsed_json);
},

error: function (parsedjson, textStatus, errorThrown) {
console.log("parsedJson: " + JSON.stringify(parsedjson));

$('body').append(
    "parsedJson status: " + parsedjson.status + '</br>' + 
    "errorStatus: " + textStatus + '</br>' + 
    "errorThrown: " + errorThrown);        

 }
});

jsfiddle-обрабатывать ошибки с вызовом jQuery ajax и типом данных JSONP-Ошибка 404


Я создаю хрупкий проект JS, который использует jquery-jsonp, и придумал подход dual-jsonp/ajax, который обрабатывает ошибки независимо от того, какой метод в конечном итоге используется.

function authenticate(user, pass) {
    var ajax = ($.jsonp || $.ajax)({
        'url': /* your auth url */,
        'data': { /* user, pass, ... */ },
        'contentType': "application/javascript",
        'dataType': 'jsonp',
        'callbackParameter': 'callback'  // $.jsonp only; $.ajax uses 'jsonpCallback'
    });
    ajax.done(function (data) {
        // your success events
    });
    ajax.fail(function (jqXHR, textStatus, errorThrown) {
        // $.jsonp calls this func as function (jqXHR, textStatus)
        // and $.ajax calls this func with the given signature
        console.error('AJAX / JSONP ' + textStatus + ': ' +
            (errorThrown || jqXHR.url));
    });
}

Так как jQuery-jsonp и$.ajax поддерживает отложенную спецификацию jQuery, мы можем объединить два обработчика ошибок вместе, обрабатывая ошибки 400 и 500 серий, а также таймауты поиска.


старый вопрос, но у меня была та же проблема. Вот решение, которое сработало для меня.

Если вы собственные домен, в котором вы снимаете свой запрос, вы можете установить переменную в ответе и проверить ее на стороне клиента.

Сервер:

SERVER_RESPONSE=true; Callback(parameter1, parameter2);

Клиентской Стороне:

if(typeof SERVER_RESPONSE === 'undefined'){
  console.log('No Response, maybe server is down');
}
else{
  console.log('Got a server response');
}