2013-04-12 42 views
1

嗨,我正面臨一個奇怪的問題。我需要使用來自不同域的webservice。所以,我看着鉻插件簡單的REST客戶端的代碼,我發現,他們正在使用此功能進行XHR跨域XHR

function sendRequest() { 
clearFields(); 
if ($("#url").val() != "") { 
    var a = new XMLHttpRequest; 
    a.onreadystatechange = readResponse; 
    try { 
     a.open($("input[type=radio]:checked").val(), $("#url").val(), true); 
     //This code is for adding headers 
     var b = $("#headers").val(); 
     b = b.split("\n"); 
     for (var c = 0; c < b.length; c++) { 
      var d = b[c].split(": "); 
      d[1] && a.setRequestHeader(d[0], d[1]) 
     } 
     jQuery.inArray($("input[type=radio]:checked").val(), ["post", "put"]) > -1 ? a.send($("#postputdata").val()) : a.send("") 
    } catch (e) { 
     console.log(e); 

     $("#responsePrint").css("display", "") 
    } 
} else { 
    console.log("no uri"); 

} 
} 

所以我創建了類似的一個

var xmlhttp; 
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
} 
else {// code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     var test = $(xmlhttp.responseText); 
    } 
} 
xmlhttp.open("GET", "http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", true); 
//xmlhttp.setRequestHeader('Access-Control-Allow-Origin','*'); 
xmlhttp.send(); 

但隨着我代碼我得到XMLHttpRequest cannot load http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy. Origin http://localhost:51582 is not allowed by Access-Control-Allow-Origin. 那麼問題在哪裏?爲什麼前面的代碼工作,我甚至都不是幾乎相同?

編輯: 我也試着撥打興田Web服務使用此功能

$.ajax({ 
    type: "GET", 
    url: "http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", 
    contentType: "script; charset=utf-8", 
    dataType: "jsonp", 
    success: function (msg) { 
     var tes = $(msg); 
    }, 
    error: function (xhr, status, err) { 
    } 
}); 

和我想要做的就是讀取響應,DOM,因爲web服務返回整個HTML頁面,我只需要一個DIV,但現在我得到Uncaught SyntaxError: Unexpected token <指向此行

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

,我可以在網絡選項卡中看到,請求工作,但由於錯誤的成功,函數沒有被調用,我不能訪問數據。

+0

當從http:// localhost:51582運行時,原始代碼是否工作? –

+0

可能重複的[XmlHttpRequest錯誤:原始null不被Access-Control-Allow-Origin允許](http://stackoverflow.com/questions/3595515/xmlhttprequest-error-origin-null-is-not-allowed-by -access-control-allow-origin) –

回答

1

正如其他人指出的,這是由於Same Origin Policy。這是由瀏覽器強制執行的,這意味着附加組件可以繞過此限制。這應該回答你最初的問題。

如何解決這個問題?有很多方法,但其中大多數需要服務器的某種合作。人們已經在這裏提到了其中的一些解決方法,顯然你嘗試了JSONP路徑並得到了錯誤。

你爲什麼得到錯誤?因爲腳本預計會以JSONP格式獲得響應,並且它不會:它會改爲獲得HTML響應。我認爲這種方法不適用於你的情況,因爲服務器肯定不是爲此設計的。

現在真正的問題是:你爲什麼要這麼做?根據你的答案,我可以想到幾個解決方案。例如,如果您需要訪問該網頁上的信息以顯示在您的網站上,我相信最簡單的解決方案是使用一些代理(請參閱http://developer.yahoo.com/javascript/howto-proxy.html瞭解更多信息)。

如果您只是將自己的機器用於個人目的,可能會在某些瀏覽器中禁用相同的原產地策略檢查。

在Chrome中,例如,使用下列選項運行它會做的伎倆:(警告:不支持的安全性肯定會吃虧)

chrome --disable-web-security 

如果你這樣做(禁用瀏覽器的安全檢查),即使是一個簡單的:

$.get("http://aplikace.mvcr.cz/sbirka-zakonu/SearchResult.aspx?q=1/2013&typeLaw=zakon&what=Cislo_zakona_smlouvy", function(data) { 
    console.log(data); 
},'html'); 

將正常工作。

1

Same Orgin Policy Prevents你從事這件事。因此,錯誤http://localhost:51582 is not allowed by Access-Control-Allow-Origin.

+0

但是來自REST客戶端,它是瀏覽器的附件,因此從我的IP運行,它的工作原理是什麼?如果它如你所說,有什麼方法可以使它工作?因爲當我嘗試使用jQuery並使用參數jsonp獲取()時,它可以工作,但是我不能在這種情況下使用jQuery – david

+1

如果它們支持JSONP而不是JSONP請求。 – epascarello

+0

我試圖使用jsonp,因爲我建議,但我得到另一個錯誤,因爲我在編輯中描述 – david

0

瀏覽器插件/擴展程序以不同的權限運行,並且在與常規網頁不同的環境中運行。我懷疑你的代碼應該工作,如果成爲一個插件。它不會像普通的網頁一樣工作。

從CORS到代理有這個問題的解決方法。在這裏搜索「cross domain ajax」或谷歌周圍。