0

下面是我试图通过 Ajax 调用进行的跨域调用。我们使用的 Web 服务只返回 XML,所以我不能jsonp用作dataType. 正如我在下面写的,我在 Chrome 的调试器中收到以下错误:

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)
        },
4

2 回答 2

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 Boilerplate .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 代码)可以通过一些巧妙的编码来实现,但这会更加困难 -在返回 XML 时使用 JSONP

此外,如果数据是敏感的,那么您可能不想在没有私钥方案的情况下执行任何类型的跨域请求,因为我不确定是否可以欺骗原始请求标头。另一种方法是为您的网站设置连接,以便在后端而不是前端共享数据。

此外,JavaScript 函数名称不大写,除非它们是构造函数。

于 2013-03-21T20:35:55.147 回答
0
beforeSend: function(request){
    var sourceDomain = request.Headers["Origin"];
    request.setRequestHeader("Access-Control-Allow-Origin", sourceDomain)
},

您试图在创建请求之前访问它,从而引发未定义的错误。请求是传递给beforeSend()回调函数的 jqXHR 对象。

于 2013-03-21T15:36:43.483 回答