Подтвердить что ты не робот

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

Ответ 1

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

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

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

Ответ 2

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

Ошибка

Функция, вызываемая, если запрос терпит неудачу (...) Примечание. Этот обработчик не, вызываемый для междоменного script и междоменного 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 (посмотрите здесь и здесь) можно использовать для преодоления ограничения политики происхождения, вы не можете использовать POST с помощью 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, а в документации говорится:

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

Ответ 3

Я так долго боролся, как вы, пытаясь обработать ошибки в запросах 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 call и JSONP dataType - Ошибка 404

Ответ 4

Я создаю хрупкий проект 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 Deferred, мы можем объединить два обработчика ошибок вместе, обрабатывая ошибки 400 и 500, а также тайм-ауты поиска.

Ответ 5

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

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

Сторона сервера:

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');
}