JQuery AJAX-запрос с использованием ошибки JSONP - PullRequest
6 голосов
/ 09 марта 2011

Я пишу приложение, и мне нужно получить доступ к некоторым данным 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 ]

7 голосов
/ 14 июня 2012

Когда dataType равен jsonp, jquery не будет запускать функцию ошибки автоматически. Это описано в документации под опцией «error»:

Примечание. Этот обработчик не вызывается для междоменного сценария и JSONP. Запросы. см. Здесь .

Обходной путь - явно указать время ожидания в качестве опции. Если сервер не отвечает в течение указанного времени, будет вызвана функция ошибки. Подробнее об этом здесь .

5 голосов
/ 17 марта 2011

Я сталкивался с этой ошибкой раньше и решил после использования 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);
      }
  });
2 голосов
/ 09 февраля 2012

для анализа внешних каналов и выявления возможных ошибок, вы можете использовать это

 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);
1 голос
/ 10 июня 2012

Заменить: тип данных на dataType

...