getJson проблемы с возвратом массива

0

Я пытаюсь разобрать некоторые данные из файла JSON. О файле JSON можно прочитать здесь: http://api.bandsintown.com/artists/weezer/events.json

Я использую jQuery для извлечения JSON файла с помощью функции $.getJSON, но ничего не происходит, когда я пытаюсь добавить данные или попытаться показать их в окне предупреждения.

Код:

$.getJSON("api.bandsintown.com/artists/weezer/events.json", function(result) {

    $.each(result, function(key, val) {
        alert(key + val);
    });

});

Я использовал несколько подходов, но я не могу найти проблему.

  • 2
    Вы пробовали вместо этого "http://api.bandsintown.com/artists/weezer/events.json" ?
  • 0
    Любые ошибки в консоли браузера?
Показать ещё 6 комментариев
Теги:

4 ответа

2
Лучший ответ

Похоже, вы выполняете кросс-доменный запрос в AJAX. Так что это не работает.

Попробуйте jsonp:

$.getJSON("http://api.bandsintown.com/artists/weezer/events.json?callback=? 
&app_id=ramesh", function(result) {

    $.each(result, function(key, val) {
      alert(key + val);
    }); 

});

Рабочая скрипка: http://jsfiddle.net/WtaPu/1/

app_id отправляется со ссылкой http://www.bandsintown.com/api/authentication

  • 0
    Спасибо, что сделал это. Таким образом, добавив обратный вызов, вы используете jsonp? Я все еще немного смущен. Я предпочел бы понять механику, чем просто скопировать код других людей.
  • 0
    «Если URL-адрес содержит строку« callback =? »(Или аналогичную, как определено серверным API), запрос обрабатывается как JSONP.». - от api.jquery.com/jQuery.getJSON
Показать ещё 1 комментарий
0

Попытка на моей консоли, я получаю следующее:

[Error] XMLHttpRequest cannot load http://api.bandsintown.com/artists/weezer/events.json. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

Эта "проблема" называется Cross-Origin Resource Sharing (иначе CORS):

В этом документе определяется механизм, позволяющий запрашивать запросы на кросс-начало на стороне клиента. Спецификации, которые позволяют API выполнять запросы с перекрестными источниками для ресурсов, могут использовать алгоритмы, определенные этой спецификацией. Если такой API используется на ресурсах example.org, ресурс на hello-world.example.org может выбрать использование механизма, описанного в этой спецификации (например, указание Access-Control-Allow-Origin: example.org в качестве заголовка ответа), что позволило бы получить этот ресурс из-за перекрестного происхождения из example.org.

Это меканизм безопасности, который по умолчанию, браузеры и серверы применяются при получении данных по межсайтовой связи. Рекомендация WORS в CORS говорит о том, что сервер должен реализовать заголовок Access-Control-Allow-Origin, указав ваш сервер как разрешенный или разрешить всем извлекать данные из него (используя подстановочный знак *):

Пользовательские агенты обычно применяют ограничения одного и того же происхождения к сетевым запросам. Эти ограничения не позволяют веб-приложению на стороне клиента работать от одного источника от получения данных, полученных из другого источника, а также ограничить небезопасные HTTP-запросы, которые могут автоматически запускаться по направлениям, которые отличаются от происхождения запущенных приложений.

Это относится только к пользовательским агентам (главным образом, к браузерам). Таким образом, попытка получить данные через рубин, например, дает соответственно:

require 'open-uri'
open("http://api.bandsintown.com/artists/weezer/events.json"){|f| f.read()}

Это вернет строку, содержащую JSON.

О JSONP: вы тоже не сможете использовать его - сервер должен вернуть данные JSON внутри функции обратного вызова:

my_callback([{"valid_json":"no!"},{"valid_javascript":"yes!"}])

Что было бы сделано (если поддерживается) через тег скрипта:

<script type="text/javascript" src="http://api.bandsintown.com/artists/weezer/events.json?jsonp=my_callback"></script>

Источник: W3C

  • 0
    Я бы сказал, что проблема называется политикой того же происхождения, а одно решение называется CORS .
  • 0
    Эта политика является частью CORS, которая указывает на возможные проблемы с выполнением междоменных запросов, история этого невозможна, и теперь она включает спецификации, позволяющие это делать. Если бы политика не была частью CORS, мы не смогли бы хотлинкировать файлы, например, из CDN. Похоже на здравый смысл XHR: в основном это связано с асинхронными вызовами (AJAX), но его также можно использовать для выполнения скрытых синхронных запросов (например, для works / load / unload).
0

Всякий раз, когда вы выполняете кросс-браузерный запрос в AJAX, вам необходимо использовать JSONP: http://api.jquery.com/jQuery.getJSON/

  • 0
    Нет, CORS является альтернативой. И JSONP работает, только если сервер поддерживает это.
0

Использовать завиток

$to=curl_init('http://api.bandsintown.com/artists/weezer/events.json');

curl_setopt( $to, CURLOPT_POST, true );
curl_setopt( $to, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $to, CURLOPT_POSTFIELDS, $post );
curl_setopt( $to, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec( $to);// final result
  • 0
    Фактическая проблема заключается в том, что OP не может сделать Ajax-запрос к URL.
  • 0
    Все еще ничего не возвращает.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню