Обработка ошибок запроса 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);
}
})
}
706   5  

5 ответов:

Два способа обработки ошибок,

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

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

Если вы проверяете jQuery.документация ajax () , вы можете найти:

Ошибка

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

Из-за этого вы вынуждены искать обходные пути. Вы можете указать тайм-аут для запуска обратного вызова ошибки. Это означает, что в течение указанного периода времени запрос должен быть успешно завершить. В противном случае предположим, что он потерпел неудачу:
$.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 DataType, однако я хочу поделиться с вами своим кодом, надеюсь, это поможет. Самое главное - включить таймаут на запрос 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 dataType-Error 404

Я создаю хрупкий проект JS, который использует jquery-jsonp, и придумал двойной подход 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');
}

Comments

    Ничего не найдено.