Обработка ошибок запроса 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 ответов
два способа обработки ошибок
нет обработки ошибок для междоменных запросов JSONP. Используйте плагин jsonp, доступный на Github https://github.com/jaubourg/jquery-jsonp это обеспечивает поддержку для обработки ошибок.
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');
}