2013-03-21 17 views
0

以下是我試圖通過Ajax調用進行的跨域調用。我們使用的Web服務僅返回XML,因此我不能使用jsonp作爲dataType。正如我在它下面寫的,我收到以下錯誤在Chrome的調試器:在Ajax調用中實現響應標頭

Uncaught ReferenceError: Request is not defined

下面是代碼:

function GetProgramDetails() { 
    var URL = "http://quahildy01/xRMDRMA02/xrmservices/2011/OrganizationData.svc/AccountSet?$select=AccountId,Name,neu_UniqueId&$filter=startswith(Name,\'" + $('.searchbox').val() + "\')"; 
    var sourceDomain = Request.Headers["Origin"]; 
    var request = $.ajax({ 
     type: 'POST', 
     beforeSend: function(request){ 
      request.setRequestHeader("Access-Control-Allow-Origin", sourceDomain) 
     }, 
     url: URL, 
     contentType: "application/x-www-form-urlencoded", 
     crossDomain: true, 
     dataType: XMLHttpRequest, 
     success: function (data) { 
      console.log(data); 
      alert(data); 
     }, 
     error: function (data) { 
      console.log(data); 
      alert("Unable to process your resquest at this time."); 
     } 
    }); 
} 

編輯

我試過以下版本這段代碼並沒有在錯誤信息中看到任何不同的內容。這是在企業環境中使用的,所以有可能由於服務器上的安全功能,這是不可能的?我對Ajax是全新的,所以我不知道這是否可以在100%的時間內運行,或者只是在大部分設置中運行。

 beforeSend: function (request) { 
      request.setRequestHeader("Access-Control-Allow-Origin: *") 
     }, 


     beforeSend: function (request) { 
      request.setRequestHeader("Access-Control-Allow-Origin: ", "http://localhost:55152") 
     }, 

     beforeSend: function (request) { 
      request.setRequestHeader("Access-Control-Allow-Origin", "http://localhost:55152") 
     }, 

     beforeSend: function (request) { 
      var sourceDomain = request.Headers["http://localhost:55152"]; 
      request.setRequestHeader("Access-Control-Allow-Origin: ", sourceDomain) 
     }, 

     beforeSend: function (request) { 
      var sourceDomain = location.protocol + '//' + location.host; 
      request.setRequestHeader("Access-Control-Allow-Origin: ", sourceDomain) 
     }, 

回答

1

這就是你的問題:var sourceDomain = Request.Headers["Origin"];你還沒有定義Request,首都是R

您的問題的肉將在跨域請求。這是可能的,你在正確的軌道上,但Access-Control-Allow-Origin是在服務器上作爲響應標頭設置的東西,而不是客戶端通過XHR作爲請求標頭髮送的東西。見https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Access-Control-Allow-Origin

查看HTML5樣板的.htaccess爲如何設置這在Apache https://github.com/h5bp/html5-boilerplate/blob/master/.htaccess,並注意瀏覽器的限制https://www.bionicspirit.com/blog/2011/03/24/cross-domain-requests.html一個例子 - 尤其是,這並不在IE7和IE瀏覽器不支持通配符*工作。

試圖模仿JSONP(從服務器返回的可執行的JavaScript代碼)可能與一些聰明的編碼,但是這將是更加困難 - Using JSONP when returning XML

此外,如果數據是敏感的,那麼你可能不希望這樣做任何類型的沒有私鑰方案的跨域請求,因爲我不確定源請求頭是否可以被欺騙。另一種方法是爲您的網站建立一個連接,以在後端而不是前端共享數據。

此外,JavaScript函數名不會大寫,除非它們是構造函數。

0
beforeSend: function(request){ 
    var sourceDomain = request.Headers["Origin"]; 
    request.setRequestHeader("Access-Control-Allow-Origin", sourceDomain) 
}, 

您試圖訪問其創建的請求之前,從而引發未定義的錯誤。請求是傳遞給beforeSend()回調函數的jqXHR對象。

+0

當我執行這個時,我得到的錯誤:未捕獲的TypeError:無法讀取屬性未定義的'Origin' – NealR 2013-03-21 15:40:09

+0

對不起,意思是說,無論我改變'[「Origin」]'(在我的情況下'http:// localhost:55152')我得到'Uncaught TypeError' – NealR 2013-03-21 15:52:06

+0

你爲什麼要設置sourceDomain那樣?爲什麼不從URL中獲取? jqXHR沒有「Headers」屬性/方法。 – 2013-03-21 15:56:13