2012-08-17 88 views
2

我在嘗試使用this question中的Web服務驗證Feed。用javascript調用外部網頁(跨域)

但瀏覽器不允許我發送ajax GET請求到另一臺服務器。在該Web服務中,每個請求都有一秒限制,所以我無法從我的服務器鏡像請求。

這是我目前的jQuery代碼:

var reqUrl = "http://validator.w3.org/feed/check.cgi?url=" + encodeURIComponent(theUrl); 
$.get(reqUrl, function(data) { 
    // do something 
}); 

是不是有什麼其他辦法?

回答

2

Ajax調用不能跨不同的域有效。 JQuery-ajax-cross-domain是一個類似的問題,可能會給你一些見解。正如Luis在評論中指出的那樣,JSONP也必須在您從中獲取數據的域上實施。

這裏是jQuery的阿賈克斯()的一個例子,但你可能想看看$.getJSON()

$.ajax({ 
    url: 'http://yourUrl?callback=?', 
    dataType: 'jsonp', 
    success: processJSON 
}); 

另一種選擇是CORS(跨源資源共享),但是,這需要其他服務器在這種情況下最有可能不會發生CORS。

+0

我將等待您的示例:) – 2012-08-17 00:28:51

+0

要使用JSONP,端點還必須實現它。 – Luis 2012-08-17 00:30:56

+0

但正如你所看到的,它是W3服務器,我無法在服務器中實現JSONP。他們是否在他們的服務器上實現了JSONP? – 2012-08-17 00:41:29

2

我搜索谷歌,找到this。第三個答案說:

在計算中,同樣的起源策略是許多瀏覽器端編程語言(如JavaScript)的重要安全概念。該策略允許在源自同一站點的頁面上運行的腳本訪問彼此的方法和屬性,而不受特定的限制,但是阻止訪問不同站點上的頁面上的大多數方法和屬性。 (source)

你最好看到this問題的答案。

我想你不能使用JSONP,因爲你沒有任何訪問W3C腳本的權限。

更新(解釋)

我我掛有另一種方式,我可以解釋給你的問題。如果您將Access-Control-Allow-Origin標頭設置爲*作爲答案,您可以將請求發送到其他域。並且可以在MVC應用程序中輕鬆使用它,您可以看到this解決方案。 好運

UPDATE2

,讓剛剛http://validator.w3.org/你只需要設置Access-Control-Allow-Originhttp://validator.w3.org/

更多的細節,回答說去here。除非你使用JSONP

+1

您的鏈接指向這個問題! – 2012-08-17 00:29:39

+0

@MahdiGhiasi這是錯的!我編輯了它,並且我添加了一個解決方案! – 2012-08-17 00:35:14

+0

請閱讀我的問題。我告訴我爲什麼我不能在服務器端做... – 2012-08-17 00:36:37

1

至於說你可以使用JSONP但端點也必須實現它,而它僅使用,如果你是從呼叫請求JSON數據。它看起來像你正在檢索HTML。

您也可以在您的域中實現一個簡單代理,從外部位置獲取數據並將其提供給ajax調用。您可以使用例如CURL在PHP中開發一個簡單的代理。

請確保您瞭解此安全明智的含義,確保您保護您的代理以僅調用該外部URL(白名單)。

更新:我只注意到你不能使用代理解決方案。並且在您按照鏈接建議我遇到CORS後,我沒有了解事件。因此,當您在域中提供頁面時,您可以設置一些標題,以指示瀏覽器可以完成對某些域的請求。

檢查這個網頁,如何實現它:

http://enable-cors.org/

我已閱讀,你可能不得不調整它有點與IE瀏覽器的工作,但似乎所有的瀏覽器目前正在實施它。

+0

請閱讀我的問題:* ...該Web服務中每個請求都有一秒限制,所以我無法對來自我的服務器的請求進行鏡像。* – 2012-08-17 00:37:40

+0

在ahmadalishafiee在他的答案中鏈接的頁面中,有一些關於http頭文件的解決方案。你知道它是什麼以及如何使用它? – 2012-08-17 00:39:45

+0

我已經啓用了這個頭文件(並在web-sniffer.net中進行了測試),但是我的代碼仍然無法正常工作...... http://azinium.com/test.html您可以告訴我,我的代碼有什麼問題嗎? – 2012-08-17 01:06:45

0

我知道這是一個老問題,但我自己也一直在嘗試創建AJAX請求到validator.w3.org以及碰到同樣的問題,並偶然發現這個問題。

但是,我確實找到了解決辦法;

由於人們已經說過,這裏的主要問題是,服務器必須出具有效的CORS頭,即

訪問控制允許來源:*

我使用提琴手檢查響應頭來自validator.w3.org,果然,標題沒有設置。但是,他們在validator.w3.org/nu/上也有另一個工具。

下面是一個例子:http://codepen.io/DDN-Shep/pen/ogdGgO/

$('form').on('submit', function(e) { 
    e.preventDefault(); 

    var data = new FormData(this); 

    $.ajax({ 
    url: 'http://validator.w3.org/nu/', // Trailing '/' is important or you get a 301 HTTP response status code 
    type: 'POST', 
    data: data, 
    processData: false, // Required for jQuery & FormData 
    contentType: false, // Set by FormData, required by the server 
    success: function(data, status, xhr) { /* TODO */ }, 
    error: function(xhr, status, error) { /* TODO */ }, 
    complete: function(xhr, status) { /* TODO */ } 
    }); 
}); 

你若遇上不確定服務器是否允許CORS,你可以使用這個非常有用的在線工具;

test-cors.org = http://client.cors-api.appspot.com/client