2015-11-01 80 views
3

我正嘗試使用MediaWiki API在維基共享資源上搜索圖像。這是我的請求的URL與搜索PARAMS:如何閱讀MediaWiki API JSON響應

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

我成功得到JSON格式的響應,但我不能讀它編程,因爲:

否「訪問控制允許-Origin'標題出現在請求的 資源中。

有什麼建議嗎?

UPDATE:

我已經增加了一個PARAM到url:callback=JSON_CALLBACK,其將響應於JSONP格式。現在也可以使用角度$http.jsonp()方法。

回答

3

使用jsonp作爲dataType防止「否‘訪問控制允許來源’標題存在於所請求的資源。」錯誤。然後,它的工作原理:

$.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/

JSONP代表「JSON與填充」,它是用於從不同的域加載數據一種解決方法。它會將腳本加載到DOM的頭部,因此您可以像訪問自己的域一樣訪問信息,從而繞過跨域問題cite

+1

非常感謝,這真的很快,很有幫助! –

1

如果您是從維基百科維基訪問維基共享資源API ,您可以使用API​​的origin參數,這樣使API設置CORS headers。例如。在en.wikipedia.org,你可以訪問共享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可能會產生大量有用的結果。

+0

如果您想使用純javscript訪問MediaWiki搜索API,那麼該怎麼辦? –

+1

@BrianZ:在瀏覽器中,可以使用[XHR](https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)和['JSON.parse()'](https:/ /developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)。 –

+0

我有一個XHR和'JSON的工作示例。解析()'在這裏 - http://jsbin.com/gilunipiwe/edit?html,js,output。如果您打開瀏覽器控制檯,則會看到該示例在網絡級別獲得響應,但遭遇「跨源請求被阻止」。我怎麼能在這裏的jsbin例子中通過這個Cross-origin塊? –