$.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)


arrow_upward
0
arrow_downward

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

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

person Jonny Burger    schedule 20.04.2012

arrow_upward
0
arrow_downward

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

person Kevin B    schedule 20.04.2012

arrow_upward
0
arrow_downward

Не используйте 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

arrow_upward
0
arrow_downward

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

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

person Lazerblade    schedule 20.04.2012

arrow_upward
0
arrow_downward

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

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

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

person Jiab77    schedule 30.12.2016