我正在努力实现CORS,以便我的Ember应用可以与另一台服务器上的API通信。我需要发送两个请求:通过POST发送身份验证请求,然后向其中一个API端点发送GET请求。
两个请求都启动了预检请求。验证预检请求运行正常。然后,当我向API运行请求时,预检请求会挂起。 Chrome会将状态和类型显示为“待处理”,请求永远不会完成。
这是验证码。我在这里使用jQuery 1.10.2。
$.ajax({
type: 'POST',
url: 'https://blahblahblah.edu/AstraDev/Logon.ashx',
data: "{username: '', password: ''}",
contentType: 'text/json',
xhrFields: {
withCredentials: false
},
headers: {
},
success: function(response) {
console.log(response);
},
error: function(response) {
console.log(response);
}
});
与API GET请求非常相似的代码
$.ajax({
type: 'GET',
url: 'https://blahblahblah.edu/AstraDev/~api/query/room',
data: {fields: "Id"},
contentType: 'application/json; charset=utf-8',
xhrFields: {
withCredentials: true
},
headers: {
},
success: function(response) {
console.log(response)
},
error: function(response) {
console.log(response)
}
});
如果我将GET的内容类型更改为不预检(例如“text / plain”),则请求失败。但如果我做任何预检,那么预检就会挂起。
这是相关的服务器配置。我正在使用IIS 7.5。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:8888" />
<add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
CORS对我来说很新鲜。所以也许我错过了一些明显的东西。有任何想法吗?感谢。
答案 0 :(得分:0)
没有看到响应标头可能有很多原因。但这是我在处理PreFlight问题时发现的。这是一个在预检检查后处理json体的JavaScript示例。最初的xhr.open与teamviewer服务器进行预检检查。您只需根据需要发送最少的请求标头以满足预检。当预检通过时,json身体被发送。
function createsession(groupid, meetwith) {
var xhr = new XMLHttpRequest();
var url = 'https://webapi.teamviewer.com/api/v1/sessions';
var jbody = JSON.stringify({"groupid": groupid,
"description": "Global Manager Intervention",
"end_customer": { "name": "" + meetwith + "" }
});
callTVAPI();
function callTVAPI() {
if (xhr) {
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Authorization', 'Bearer @(ViewBag.TeamViewerToken)');
xhr.onreadystatechange = function () {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
}
if (xhr.status !== 200) {
return;
}
var data = jQuery.parseJSON(xhr.response);
alertify.success("Launching: " + data.supporter_link);
};
xhr.send(jbody);
}
}
}