2

所以我有一个简单的 getJSON() 函数:

            $.getJSON(apiURL, function(data) {
                 console.log('success');
                if (data.results.length > 0) {
                    $(song).find('source').attr('src', data.results[0].previewUrl);
                    song.play();
                }
                else {
                    console.log('No match found for track information specified.');
                }
            });

apiURL 是一个 iTunes API url,定义如下:

            var apiURL =" https://itunes.apple.com/search" +
                "?term=" + artist + "+" + album + "+" + title +·
                "&media=music&entity=musicTrack&callback=?";

我得到经典的 Origin localhost is not allowed by Access-Control-Allow-Origin 错误。我已经为此挖掘了一些答案,它们通常归结为使用 $.ajax 并将 dataType 设置为“jsonp”,或者使用 .getJSON 并提供“callback=?” URL 的参数,我在上面尝试过。这些似乎都不起作用,我听说它们可能已经过时了。处理此问题的最新建议是什么?除了收集服务器上的数据。

4

3 回答 3

5

你的 api url 的开头有一个空格......一旦我删除了它,调用就通过了:

http://jsfiddle.net/UU8tT/

var apiURL = "https://itunes.apple.com/search" +
于 2013-10-18T21:30:45.677 回答
3

尝试使用完整.ajax方法,而不是.getJSON速记方法:

var terms = ["Halestorm"];
terms.forEach(function (val, i, arr) {
    terms[i] = encodeURIComponent(val);
});
$.ajax({
    "url": "https://itunes.apple.com/search",
    "dataType": "jsonp",
    "data": {
        "term": terms.join('+'),
        "media": "music",
        "entity": "musicTrack"
    },
    "error": function (jqXHR, textStatus, message) {
        console.log(message);
    },
    "success": function (data, textStatus, jqXHR) {
        console.log(data);
    }
});

以上在浏览器控制台中对我有用(在stackoverflow上)。它也适用于 jsFiddle:http: //jsfiddle.net/xYthU/

于 2013-10-18T21:30:31.357 回答
1

浏览器将使用 OPTIONS 方法请求服务器。服务器必须响应以下标头以支持 CORS。

  1. 访问控制允许标头:接受
  2. 访问控制允许方法:*
  3. 访问控制允许来源:*

如果我们使用 OPTIONS 方法请求https://itunes.apple.com/search URL。它以不支持的错误响应。

截图:https ://blog.gaurangjadia.com/wp-content/uploads/2013/10/itunes.apple_.com_.png

于 2013-10-18T22:18:09.387 回答