Как прочитать ответ MediaWiki API JSON

Я пытаюсь искать изображения в Wikimedia Commons, используя MediaWiki API. Вот мой запрошенный URL с поисковыми параметрами:

https://commons.wikimedia.org/w/api.php?action=query&list=allimages&format=json&aifrom=Dada

Мне удалось получить ответ в формате JSON, но я не смог прочитать его программно, потому что:

В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin".

Любой совет?

ОБНОВИТЬ:

Я добавил еще один параметр в URL: callback=JSON_CALLBACK, который преобразует ответ в формате jsonp. Теперь можно использовать угловые $http.jsonp() метод тоже.

2 ответа

Решение

Использование jsonp 1 как dataType для предотвращения появления ошибки " Нет Access-Control-Allow-Origin" в запрашиваемом ресурсе. " Тогда это работает:

$.ajax({
    dataType: 'jsonp',
    url : 'https://commons.wikimedia.org/w/api.php?action=query&list=allimages&format=json&aifrom=Dada',
    success : function(json) {
        json.query.allimages.forEach(function(item) {
            $('<img/>', { src : item.url }).appendTo('#images');
        })    
    }     
})    

Здесь я добавляю каждое изображение в #images<div> только для демонстрационных целей.

демо -> http://jsfiddle.net/52g2Lazw/

1) JSONP означает "JSON with Padding" и это обходной путь для загрузки данных из разных доменов. Он загружает скрипт в начало DOM, и, таким образом, вы можете получить доступ к информации, как если бы она была загружена в вашем собственном домене, таким образом, минуя междоменную проблему.

Если вы получаете доступ к API Wikimedia Commons из вики Wikimedia, вы можете использовать origin Параметр API и таким образом сделать API установкой заголовков CORS. Например, на https://en.wikipedia.org/ вы можете получить доступ к Commons API следующим образом:

$.get('https://commons.wikimedia.org/w/api.php?' +
    $.param({
        format: 'json',
        action: 'query',
        list: 'allimages',
        aifrom: 'Dada',
        origin: location.protocol + '//' + location.host
    })).done(function() { /*...*/ });

Как правило, безопаснее использовать JSON (чистый формат данных), чем загружать и выполнять файл JavaScript (JSONP), который теоретически может навредить вашим посетителям. Я бы, вероятно, настроил прокси-сервер для этой цели вместо использования JSONP. Простой веб-поиск set up a proxy json может привести к большому количеству полезных результатов.

Другие вопросы по тегам