Bezdepbonusu7Программирование: статьи и ответы

Вопрос

$.ajax и $.getJSON для json и jsonp не могут правильно получить ответ от стороннего сервера

Автор вопроса: RedrascalОтветов: 5

Как следует из названия, я пытаюсь получить json из API, предоставленного сайтом. Сейчас я пробовал разные вещи и получил разные результаты. Я хочу иметь возможность извлекать и анализировать json, чтобы получать от него нужную мне информацию. Вот что я пробовал:

1) Кусок кода $.ajax() (запускается при нажатии кнопки):

  $.ajax({
            type: 'GET',
            url: url,
            dataType: 'json',
            success: function(data) {
                alert('Success!');
            }
        });

Это приводит к тому, что "нулевое происхождение не разрешено Access-Control-Allow-Origin". ошибка и не получает ответа от сервера (для Chrome или FF меня не волнует IE, так как это небольшой проект для моего использования). Оглядываясь, я подумал, что проблема может заключаться в том, что мне это нужно jsonp dataType, так как я пытаюсь подключиться к внешнему веб-сайту. Это привело меня к попытке # 2

2) $.ajax с типом данных jsonp

$.ajax({
        type: 'GET',
        url: url,
        dataType: 'jsonp',
        success: function(data) {
            alert('Success!');
        }
    });

Я также добавил "& callback =?" до конца "url", который я даю функции. Используя Chrom Dev Tool, на этот раз я вижу ответ сервера, но предупреждение никогда не отображается. Я использовал JSONLINT, чтобы подтвердить, что ответ был правильным json (это так), и я попытался установить json в переменную, чтобы я мог играть с ней (вдоль строк инициализации переменной ранее в теге скрипта [var response; ] и пытаемся присвоить ему json[response = data;]). Это произвело undefined, когда я попытался предупредить (ответ); позже (я не верю, что response=json; бит когда-либо вызывался по какой-то причине).

Я также пытался использовать $.getJSON, но, глядя на API для него, он все равно просто запускает $.ajax (к счастью, я получил те же ответы/ошибки при попытке json vs jsonp для $.getJSON, что и при попытке $.ajax ). Когда я пытаюсь использовать jsonp, Chrome (FF не выдает эту ошибку) показывает "Неожиданная синтаксическая ошибка: неожиданный токен:". Это заставляет меня думать, что на сайте, с которым я пытаюсь поговорить, не работает jsonp и я не могу получить доступ к стороннему сайту как просто запрос json. В ссылке рассказывается о том, как настроить сервер так, чтобы он возвращался как application/json, а не как text/html, как я получаю из своего ответа, исправив для них проблему (но опять же, я пытаюсь получить доступ к стороннему сайту и, таким образом, я могу не получить доступ к серверу).

Я пробовал это в Chrome и FF, просматривал Dev Tools/Firebug для каждого и видел одно и то же (хотя FF не выдает ошибку происхождения, но в любом случае это, по-видимому, ошибка в Chrome).

Кроме того: я взял ответ json и запустил на нем $.parseJSON, и мне удалось получить различные фрагменты, но как я могу получить доступ к json после того, как заработаю $.ajax/$.getJSON?

Буду очень признателен за любые мысли/решения.

  • Может быть проблема в политике междоменного происхождения. Вам нужно проверить, поддерживает ли API вашего сервера междоменный доступ. shashankaholic 21.04.2012

javascriptjsonjqueryjsonp

Ответы

Ответ 1 · Jonny Burger

Однажды я тоже получил ошибку Unexpected Syntax Error: Unexpected token :.

Похоже, сайт не поддерживает междоменную загрузку. Какой API вы пытаетесь использовать?

Ответ 2 · Kevin B

Более чем вероятно, что ответ является действительным JSON, но не действительным JSONP. Сторонний сервер должен поддерживать JSONP, чтобы вы могли получить ответ JSONP. Если у вас нет контроля над сторонним сервером, единственным реальным вариантом является использование прокси-сервера на стороне сервера или YQL.

Ответ 3 · lukecampbell

Не используйте JQuery AJAX для JSONP.

Используйте <script type='text/javascript' src=' URL_GOES_HERE&callback=BLAH '></script>, который окружит объект json вызовом метода javascript, после чего вы сможете использовать данные из стороннего источника.

http://en.wikipedia.org/wiki/JSONP

Ответ 4 · Lazerblade

Попробуйте плагин JSONP. Это один из немногих плагинов, которые я рекомендую, только потому, что он легкий и делает то, что должен. Это также позволяет вам проверять ответы, отличные от успеха. Отлично работает для JSONP и решил мою проблему с использованием поддомена и отсутствием правильных ответов об ошибках (которые впоследствии просто остановили код).

Получить здесь.

Ответ 5 · Jiab77

Вы пробовали таким образом?

$.getJSON( url + "?callback=?", function(data) {
    console.info(JSON.stringify(data, null, 2));
});

Примерно так я управляю обратным вызовом JSONP для http://freegeoip.net/json/.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы