Реализовать заголовок ответа в вызове 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()
функция обратного вызова.