2013-11-28 4 views
0

Я пытаюсь разобрать некоторые данные из файла JSON. Файл JSON в вопросе можно увидеть здесь: http://api.bandsintown.com/artists/weezer/events.jsongetJson problem возвращающий массив

Я использую 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

Любые ошибки в консоли браузера? – Curt

+0

Да, я пробовал с http перед адресом без везения. Я не вижу ошибок в консоли браузера. У меня есть несколько других функций getJson, где я могу без проблем загружать вещи из Freebase, Facebook и Youtube. –

ответ

2

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

Try 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

Thx taht сделал это. Итак, добавив обратный вызов, вы используете jsonp? Я все еще немного смущен. Я бы лучше понял механику, чем просто скопировать код других народов. –

+0

«Если в URL-адрес включена строка« callback =? »(Или аналогичная, как определено API-интерфейсом на стороне сервера), вместо этого запрос обрабатывается как JSONP.». - от http://api.jquery.com/jQuery.getJSON/ – Ramesh

+0

@KarstenTietje: https://en.wikipedia.org/wiki/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

Все еще ничего не возвращает. –

+0

Теперь я использую app id и версию api в URL-адресе, но ничего не возвращает. –

0

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

+0

Нет, CORS - альтернатива. И JSONP работает только в том случае, если сервер поддерживает его. –

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 (a.k.a. CORS):

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

Это защитный механизм, который по умолчанию используется браузерами и серверами при получении данных по межсайтовой связи. Рекомендация W3C из 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), но его также можно использовать для создания синхронных запросов под капотом (например, у рабочих/load/unload). – wwmoraes

Смежные вопросы