Невозможно получить данные из запроса JSON, хотя я знаю, что он возвращен
Я пытаюсь получить данные, возвращаемые из getJSON, но просто не могу заставить их работать. Я пробовал тот же код с API search.twitter, и он отлично работает, но он не работает с другим сайтом. Я знаю, что данные возвращаются, потому что я могу найти их при использовании Инспектора. Значения, которые я нахожу через инспектора:
[{"id":62093,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"It Will Follow The Rain"},{"id":62094,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Pistol Dreams"},{"id":62095,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Troubles Will Be Gone"},{"id":80523,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Love Is All"},{"id":80524,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"I Won't Be Found"},{"id":80525,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Where Do My Bluebird Fly"},{"id":80526,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Sparrow And The Medicine"},{"id":80527,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"Into The Stream"},{"id":81068,"type":"Song","artist":{"id":12382,"type":"Artist","nameWithoutThePrefix":"Tallest Man On Earth","useThePrefix":true,"name":"The Tallest Man On Earth"},"title":"The Blizzards Never Seen The Desert Sands"}]
Так что я знаю, что они возвращаются с сервера.
и мой код JS:
function searchSongsterrForTab(){
var artist = "\"The Tallest Man On Earth\""
var url = "http://www.songsterr.com/a/ra/songs/byartists.json?callback=?&artists=" + artist;
$.ajax({
url: url,
dataType: 'jsonp',
success: function(data){
$.each(data, function(i, item){
console.log(item);
});
}
});
}
Я пробовал все виды различного кода, но я просто не могу печатать значения.
Вся помощь действительно ценится!
3 ответа
Вы указали dataType
как jsonp
но сервис только возвращается json
который вы не можете использовать кросс-домен.
Сообщение об ошибке jQuery: "jQuery1710014922410249710083_1323288745545 was not called"
Это означает, что обратный вызов вызывается не так, как должно быть.
Обновить:
Есть способ получить данные, даже если служба не поддерживает формат JSONP. Смотрите эту ссылку для деталей.
Мой пример - использование скрипта jquery.xdomainajax.js, который направляет запрос ajax на YQL, который может извлечь всю HTML-страницу в формате JSONP. Таким образом, приведенный ниже пример использует обычную HTML-страницу для извлечения данных.
- Плюсы:
- Вы можете получить любой контент HTML.
- Он очень гибкий, так как вы не зависите от того, что веб-сервис может вам дать.
- Минусы:
- Это медленнее, потому что вы используете сервис Yahoo для обработки и извлечения целых данных HTML.
- Также передается больше данных.
Смотрите этот фрагмент для рабочего примера.
Код:
var artist = "The Tallest Man On Earth";
$.ajax({
url: 'http://www.songsterr.com/a/wa/search?pattern=' + escape(artist),
type: 'GET',
success: function(res) {
// see http://www.songsterr.com/a/wa/search?pattern=The%20Tallest%20Man%20On%20Earth
// 1) res.responseText => get HTML of the page
// 2) get odd anchors inside (it is zero-indexed) => get anchors containing song names
// 3) map array of anchor elements into only their text => get song names
var songs = $(res.responseText).find('div.song a:odd').map(function(i, el) { return $(el).text() });
console.log(songs);
}
});
Это просто демонстрация. Если вам нужны какие-либо другие данные со страницы, проверьте структуру страницы, извлеките ее и обработайте, как показано в примере выше.
Может быть, вы пострадали от междоменного нарушения? Вы не можете просто получить доступ к любой веб-службе со случайной веб-страницы, размещенной на другом сервере.
Songsterr не поддерживает JSONP. Это означает, что данные не оборачиваются заданной функцией обратного вызова.