Реализовать заголовок ответа в вызове Ajax

Ниже приведен междоменный вызов, который я пытаюсь сделать с помощью вызова Ajax. Используемый нами веб-сервис возвращает только 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)
        },

2 ответа

Решение

Это ваша проблема: var sourceDomain = Request.Headers["Origin"]; Вы не определили Request с большой буквы R,

Суть вашей проблемы будет в междоменном запросе. Это возможно, и вы на правильном пути, но Access-Control-Allow-Origin это то, что установлено на сервере в качестве заголовка ответа, а не то, что отправлено клиентом через XHR в качестве заголовка запроса. См. https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

Посмотрите 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 с сервера) может быть возможна с помощью некоторого умного кодирования, но это будет более трудным - Использование JSONP при возврате XML

Кроме того, если данные являются конфиденциальными, то вы, возможно, не захотите делать какие-либо междоменные запросы без схемы закрытого ключа, так как я не уверен, что заголовок исходного запроса может быть подделан. Альтернативой может быть установка соединения для ваших веб-сайтов для обмена данными на сервере, а не на сервере.

Кроме того, имена функций JavaScript не пишутся с заглавной буквы, если они не являются конструкторами.

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

Вы пытались получить доступ к запросу до того, как он был создан, что вызвало неопределенную ошибку. Запрос - это объект jqXHR, который передается beforeSend() функция обратного вызова.

Другие вопросы по тегам