Я пытаюсь разобрать некоторые данные из файла 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);
});
});
Я использовал несколько подходов, но я не могу найти проблему.
Похоже, вы выполняете кросс-доменный запрос в 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
Попытка на моей консоли, я получаю следующее:
[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
Всякий раз, когда вы выполняете кросс-браузерный запрос в AJAX, вам необходимо использовать JSONP: http://api.jquery.com/jQuery.getJSON/
Использовать завиток
$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
"http://api.bandsintown.com/artists/weezer/events.json"
?