2010-11-26 80 views
0

我能夠通過瀏覽器執行Web服務,但是當我嘗試通過javascript中的xmlhttprequest執行它時,我得到這個錯誤:Origin []不被Access-Control-Allow-Origin允許。跨站點Ajax調用

如何通過javascript調用webservice?我寧願不使用框架,只使用基本的客戶端JavaScript。

供參考,這是Web服務我想佔用的實例:http://musicbrainz.org/ws/1/track/?type=xml&query=track:alive

感謝。

+0

在musicbrainz.org之外無法用javascript完成,你需要設置一個代理服務器 – generalhenry 2010-11-26 01:51:20

+0

只是好奇而已,你使用一些服務器端腳本語言還是純粹的JavaScript?只需在服務器端創建代理腳本並使用javascript使用它就會容易得多。 – jerjer 2010-11-26 01:54:54

回答

1

不可能。您不能對其他域進行AJAX調用。這需要由服務器來完成。

+0

除了`XMLHttpRequest`外,還有更多的ajax - 實際上ajax早於這些。使用隱藏的iFrames或動態插入`

1

您不能在託管於一個域的頁面上使用XMLHttpRequest從另一個域檢索信息。瀏覽器根本不會允許它。

如果您對正在檢索的資源有一定的控制權,則一種常見的解決方法非常可靠。它被稱爲「JSONP」,技術是簡單地將<script>標籤附加到標頭(使用JavaScript動態地)。該腳本當然可以託管在任何域中,因此不存在跨站點腳本限制。如果腳本僅由JSON數據組成,那麼它不會有太大好處。但是在一個函數調用中包裝這個JSON數據 - 這是你控制的一個函數 - 並且它工作的很好。

someFunctionName({ ... }); 

如果你檢索不支持JSONP的資源,你唯一的辦法就是編寫一個腳本自己的服務器(託管在同一個域中的頁面,當然)上檢索目標數據。然後,您可以對自己的腳本進行正常的AJAX調用。

0

XmlHttpRequest是針對同一個域的請求 - 它被稱爲「同源策略」。 如果你想做跨域Ajax請求,你必須使用jsonp格式。 我不認爲使用普通的JavaScript是個好主意 - 更好的解決方案 是現成可用的框架。 jQuery或Mootools。 在jQuery中,您有方法$ .getJSON來製作簡單的JSON和JSONP請求。

更多閱讀: How exactly is the same-domain policy enforced? http://api.jquery.com/jQuery.getJSON/ http://en.wikipedia.org/wiki/JSON#JSONP

0

不可能的,但你可以在服務器上創建一個代理,並通過代理服務器訪問數據:

這裏是PHP的代理實例:

proxy.php

<?php 
    //header('Content-type: text/xml'); 
    $url = 'http://musicbrainz.org/ws/1/track/?type=xml&query=track:alivehttp://www.example.com/'; 
    $xml = file_get_contents($url); 
    echo xml; 
?> 

您現在可以使用proxy.php作爲來自javascript的源網址。