我建立这将在Azure的功能和一个Web应用程序,将在Azure Blob存储托管托管的API。这意味着我的API必须从用户的浏览器选项请求做出响应(使用邮差或卷曲时,这是不是一个问题)。
我的API适当地响应OPTIONS请求,所以这个删除任何CORS问题。
当服务器响应到客户端Javascript的选项,就会出现问题。它似乎正在作为回应,而忽略真实的反应。如何从接受选项响应停止XHR?
这里是我的功能:
function makeRequest(method, url, data) {
document.body.style.cursor = "wait";
return new Promise (function (resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open(method, url)
xhr.onload = function () {
if (this.status == 200) {
authToken = this.getResponseHeader('Authorization');
document.body.style.cursor = "initial";
console.log('responseText');
console.log(this.responseText);
resolve(JSON.parse(this.responseText));
} else if (this.status == 403) {
logout();
document.body.style.cursor = "initial";
reject({
status: this.status,
statusText: xhr.statusText
});
} else {
document.body.innerHTML = 'Error: ' + this.responseText;
document.body.style.cursor = "initial";
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
document.body.innerHTML = 'Error: ' + this.responseText;
document.body.style.cursor = "initial";
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", authToken);
xhr.send(data);
});
}
这工作,但因为我的应用程序需要能够在移动到下一个事情之前,等待来自该函数的回应,我不能用它:
function retrieveCategories(active) {
document.body.style.cursor = "wait";
var data = JSON.stringify({
"active": active
});
console.log(data);
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4 && this.status == 403) {
logout();
document.body.style.cursor = "initial";
} else if (this.readyState === 4 && this.status != 200) {
document.body.innerHTML = 'Error: ' + this.responseText;
document.body.style.cursor = "initial";
} else if (this.readyState === 4 && this.status == 200) {
authToken = this.getResponseHeader('Authorization');
categories = JSON.parse(this.responseText);
document.body.style.cursor = "initial";
}
});
xhr.open("POST", "http://127.0.0.1:7071/retrievecategories");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", authToken);
xhr.send(data);
}
想法非常感谢!
@Quentin是正确的,因为我本来以为XHR没有响应OPTIONS响应。服务器发送了格式错误的响应