JQuery AJAX-запрос с использованием ошибки JSONP
Я пишу приложение, и мне нужно получить доступ к некоторым данным JSON на стороне клиента с другого сервера. Из-за междоменной проблемы я планирую использовать jsonp. jQuery позволяет мне делать это с помощью метода $.getJSON(), однако у меня нет способа определить, произошел ли сбой метода (т. е. сервер не отвечает или что-то в этом роде). Поэтому я попробовал подход, чтобы получить данные JSON, используя вместо этого $.ajax. Но это не работает, и я не знаю, что попробовать. Вот пример, показывающий мою проблему:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>TEST</title>
<script type="text/javascript" src="scripts/jquery-1.5.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#button_detect').click(function(){
var feedApiAjax = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=';
var feedApiGetJSON = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=';
var feedUrl = 'http://www.engadget.com/rss.xml';
$.ajax({
url: feedApiAjax + feedUrl,
datatype: 'jsonp',
success: function(data) {
console.log('$.ajax() success');
},
error: function(xhr, testStatus, error) {
console.log('$.ajax() error');
}
});
$.getJSON(
feedApiGetJSON + feedUrl,
function(data) {
console.log('$.getJSON success');
});
});
});
</script>
</head>
<body>
<div id="button_detect">CLICK ME!!!!</div>
</body>
Если вы создадите веб-страницу с этим кодом и нажмете на элемент Div "Click Me", вы увидите, что запрос $.getJSON работает, а запрос $.Ajax - нет. Я пытался поставить / удалить "callback=?" tg, использовал типы данных "jsonp" и "json", но это не сработало.
Есть идеи, что я могу делать не так?
Ура!
4 ответа
Я сталкивался с этой ошибкой раньше и решил после использования jquery-JSONP
[Пример]
$.getJSON('http://server-url/Handler.ashx/?Callback=DocumentReadStatus',
{
userID: vuserID,
documentID: vdocumentID
},
function(result) {
if (result.readStatus == '1') {
alert("ACCEPTED");
}
else if (result.readStatus == '0') {
alert("NOT ACCEPTED");
}
else {
alert(result.readStatus);
}
});
Когда dataType равен jsonp, jquery не будет запускать функцию ошибки автоматически. Это описано в документации под опцией "ошибка":
Примечание. Этот обработчик не вызывается для междоменных сценариев и запросов JSONP. смотрите здесь.
Обходной путь должен явно указать время ожидания в качестве опции. Если сервер не отвечает в течение указанного времени, будет вызвана функция ошибки. Подробнее об этом здесь.
Для анализа внешних каналов и выявления возможных ошибок, вы можете использовать это
function GetContent(feedUrl)
{
var feedApiGetJSON = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=';
$.ajax({
url: feedApiGetJSON + feedUrl,
dataType: 'jsonp',
jsonpCallback: 'JsonpCallback'
});
}
function JsonpCallback(data) {
if (data.responseStatus == "200")
alert(data.responseData.feed.title);
else
alert(data.responseDetails);