2009-07-19 38 views
1

我想寫一個JavaScript應用程序,它從openstreetmap API(http://wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6)加載數據,它基本上只是一個安靜的xml api。我試圖使用jquery來訪問XMl。但是我得到安全錯誤。這是一個跨站點腳本阻止。javascript - 想用ajax訪問另一個域的內容?

如何訪問該XML? AFAIK OSM不提供jsonp,所以這是行不通的。是否有嗎?>

+0

請問[本博客](http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html)發佈幫助嗎? – 2009-07-19 16:15:44

回答

1

丹鏈接的博客文章將向您展示如何解決這個問題,但這裏的背景:

,你可以做一個跨域JavaScript調用從一個網頁是通過JSONP的唯一途徑。如果您沒有提供JSONP,那麼您將不得不訴諸使用代理腳本,因爲瀏覽器有目的地阻止站點腳本進行此類調用。

請注意,如果您正在編寫Firefox擴展程序,那麼您將在特權空間中執行,因此可以不受限制地進行此類跨域調用。

2

兩種方式來繞過跨站點腳本是建立一個服務器端代理來調用您的腳本調用您的服務器端代理的URL。另一種方法是使用腳本標記調用數據,該標記對跨站點調用沒有限制。

1

OpenStreetMap的Nominatim API現在支持JSONP,因此您可以純粹使用客戶端代碼獲取數據,而無需在您自己的服務器上額外添加任何內容。這裏有一個jsfiddle示例 - 如果你可以在jsfiddle中做到這一點,你可以在任何地方做到這一點。

有關如何從其他域訪問API的更一般問題,以下是我在涉及部分完整且常常相互矛盾的答案時通過反覆試驗學到的一些有用信息。如果有任何內容或變得不準確,請編輯或評論。

  • 如果您不能使用支持JSONP的API,你需要尋找到插件,像jquery-xdomain-ajax使用像YQL和了解他們的工作。通常,這些插件似乎適合閱讀HTML而不是查詢API。
  • 爲了能夠直接就必須一)提供的JSON結果訪問API和b)已經建立了JSONP支持,這意味着: -
    • API必須被設置爲監聽出來告訴它的參數函數的名稱將其結果包含在
    • 您必須知道調用了哪個參數。在OSM的情況下,它被稱爲json_callback,jQuery的默認callback將只在偶然的情況下工作,這是API編程監聽
    • 使用jQuery,它是這個API特定的參數鍵,它應該在您的查詢結束帶有?的URL(例如,如果它是json_callback,則someurl.com/api?json_callback=?)。 jQuery會計算出這是什麼,將?換成像jQuery1712164863864387412這樣的字符串,用相同的字符串命名內聯函數,並等待接收一些通過名稱觸發該函數的代碼並將其傳遞給JSON。
      • 如果請求有效,但回調不會觸發,並且您看到類似parseerror jQuery17109935275333671539_1300495251986 was not called的錯誤,這意味着jQuery具有名爲ready,waiting的函數,但API沒有使用該字符串來包裝JSON,所以功能不叫 - 可能你沒有使用正確的參數名稱
    • 沒有jQuery的意思是,你需要傳遞參數鍵將接收JSON命名函數的名稱
  • 由於基本上所有發生的事情是瀏覽器正在加載,然後以受控的方式運行JavaScript合作伙伴的片段相當於someFunction({"some": "argument"});,錯誤處理是有限的(但如果你使用完整的$.ajax語法而不是剝離下來的$.getJSON快捷方式,請參閱jQuery提供的jsfiddle)
  • 在Firebug中,至少JSONP請求不會出現在控制檯就像其他的AJAX調用一樣,相反,它們位於.NET面板的底部(因爲在底層,它基本上是一種循序漸進的加載代碼的方式,處理更像是<script>)。

希望這會幫助別人!

+0

...這裏是相同的jsfiddle,但使用$ .getJSON()語法而不是$ .ajax()爲任何人想看到不同之處http://jsfiddle.net/KyLza/3/ – user568458 2012-03-05 17:38:30

相關問題