Flickr JSON возвращает ошибку в кросс-домене JavaScript

У меня есть этот код, и я пытаюсь вернуть Flickr API, но я получаю следующую ошибку.

Запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленный ресурс в http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback={callback}&tags=london&tagmode=any&format=json. Это можно устранить, перемещая ресурс в тот же домен или включение CORS.

Как включить это в свой код?

enter 
MyFeed.prototype.getFeed = function(data) {

    console.log(f.feedUrl);
    var request = new XMLHttpRequest();
    request.open('GET', f.feedUrl, true);

    request.onload = function () {
        if (request.status >= 200 && request.status < 400) {
            // Success!
            console.log(request.responseText);
            var data = JSON.parse(request.responseText);
        } else {
            // We reached our target server, but it returned an error
            console.log("error");
        }
    };

    request.onerror = function () {
        // There was a connection error of some sort
    };

    request.send();
}here

Ответы

Ответ 1

Так как это использует JSONP, вы не используете XMLHttpRequest для извлечения ресурса, вы вводите элемент script с соответствующим URL-адресом src и определите функцию с тем же именем, что и параметр jsoncallback, который будет вызываться после загрузки script:

function handleTheResponse(jsonData) {
  console.log(jsonData);
}

// ... elsewhere in your code

var script = document.createElement("script");
script.src = f.feedUrl;
document.head.appendChild(script);

Просто убедитесь, что у вас есть jsoncallback=handleTheResponse (или что-то еще, что вы называете вашим методом), убедитесь, что метод доступен по всему миру, и вам должно быть хорошо идти.

Вот демо:

function handleTheResponse(data) {
    document.getElementById("response").textContent = JSON.stringify(data,null,2);
}

var script = document.createElement("script");
script.src = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=handleTheResponse&tags=london&tagmode=any&format=json"
document.head.appendChild(script);
<pre id="response">Loading...</pre>

Ответ 2

Существует несколько способов его решения: простой способ использования jQuery;

предполагая обратный вызов в

http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback= {callback} & tags = london & tagmode = any & format = json

Обратный вызов = "jQuery111203062643037081828_1446872573181"

enter 
MyFeed.prototype.getFeed = function(data) {

   $.ajax({
     url: f.feedUrl,
     dataType : "jsonp",
     success: function(response) {
       console.log(response);
     },
     error: function (e) {   
       console.log(e);
     }
   });
}here

или если вы хотите это без jQuery, это то же самое, что рекомендовал @daniel-flint.

function jsonp(url, callback) {
    var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
    window[callbackName] = function(data) {
        delete window[callbackName];
        document.body.removeChild(script);
        callback(data);
    };

    var script = document.createElement('script');
    script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' +  callbackName;
    document.body.appendChild(script);
}

jsonp('http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=callback&tags=london&tagmode=any&format=json', callback);

function callback(data){
 console.log(data);  
}