2013-03-21 53 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