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

Как следует из названия, я пытаюсь получить 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?

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


person Redrascal    schedule 20.04.2012    source источник
comment
Может быть проблема в политике междоменного происхождения. Вам нужно проверить, поддерживает ли API вашего сервера междоменный доступ.   -  person shashankaholic    schedule 21.04.2012


Ответы (5)


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

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

person Jonny Burger    schedule 20.04.2012

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

person Kevin B    schedule 20.04.2012

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

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

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

person lukecampbell    schedule 20.04.2012
comment
Мне нужно иметь возможность динамически изменять URL-адрес. Я использую раскрывающееся меню, чтобы выбрать, в какой категории я хочу искать (конец моего URL-адреса /api/catalogue/category.json?category=, где я добавляю значение выбранной категории в раскрывающемся списке. Кажется, это сложно закодированное решение.Также: как мне получить доступ к JSON, если ваше предложение работает?Можете ли вы привести пример? - person Redrascal; 21.04.2012
comment
Я попытался внедрить его в тег <script>, как у вас с &callback=trythis, где попробуйте эту функцию trythis(data){alert('Ну, что-то сработало.');}. Я получаю 200 и вижу ответ от сервера, но он возвращается как MIME-тип text/html. Я думаю, что серверную часть нужно изменить, чтобы вместо этого возвращалось приложение/javascript, но я не уверен. Есть предположения? - person Redrascal; 21.04.2012

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

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

person Lazerblade    schedule 20.04.2012

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

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

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

person Jiab77    schedule 30.12.2016