2008-11-27 76 views
6

根據我的理解,由於當前瀏覽器中的「同源策略」強制執行,無法從發送到不同於Javascript原始域的XmlHttpRequest數據中獲取數據。如何從客戶端腳本中使用遠程Web服務?

我對這件事情有接近零的經驗,所以我對Web服務在Javascript中無法使用感到困惑。 這是否意味着具有Ajax功能的Web應用程序只能與自己進行交互而無需調用其他域提供的服務? 「mash-ups」如何工作?我猜這些服務是服務器端使用的,然後通過本地的Ajax調用將數據傳遞給客戶端。我不知道。

我可以想象的實現客戶端服務消費的唯一方法是通過<script>標記直接從目標Web服務的域中檢索JavaScript文件,然後使用其API與遠程域進行交互。

任何人都可以啓發我嗎?

+0

其實你對它有很好的把握。只記得Ajax是普通的舊http。 – 2008-11-27 22:55:45

+0

是的,你打在頭上......包括周圍的工作! – 2008-11-28 03:42:59

回答

6

在你的問題你提到的<腳本>詭計。 JSONP就是基於此。 It was formally proposed almost 3 years ago by Bob Ippolito。它不會讓您有權與腳本的來源進行交談—原點是由您的網頁定義的,而不是由它包含的內容決定的。它的工作原理只是因爲服務器將JSON封裝在一個應該在代碼中定義的回調函數中,並且在加載時將由<腳本>執行。 JSONP最着名的例子是Yahoo服務,包括Flickr。

另一種技術是使用window.name傳輸信息。 This technique was detailed by Kris Zyp four month ago。另外他的文章比較了window.name傳輸和JSONP。我不知道任何支持這種新型運輸的高端服務提供商。顯然它會隨着時間而改變。

當然,我應該提到即將推出的Microsoft XDomainRequest。它正在計劃與IE8一起發貨,並且沒有其他供應商承諾支持它,但它已被列入HTML 5中.XDR是一個有用的功能塊,但我懷疑它會在更改之前進行多次更改公認。

如果您查看了您現在可能知道的鏈接,那麼所有這些方法都需要來自第三方服務器的特定級別的合作。你不能隨意使用隨機服務。如果您必須使用不合作的服務,唯一的解決方案是通過您自己的服務器代理它,並解決所有相關問題:合法性問題,性能降低,服務器負載增加,用戶瀏覽器與用戶瀏覽器之間的連接數減少你的服務器等等。

3

看一看JSONP,它使用幾乎你所描述的方法周圍的同源策略的工作,只要確保你信任,你得到它...

相關問題