我目前正在尝试发送一条POST消息,除了没有正确凭据的错误外,其工作正常。但是,在我添加凭证标头后,消息类型将更改为OPTIONS并失败。我不明白添加标头会导致类型更改为OPTIONS。任何帮助将不胜感激。
ajaxRequest = $j.ajax({
url: url,
type: 'POST',
beforeSend : function(req) {
req.setRequestHeader('Authorization', auth),
}
success: function(data, status) {
console.log("Success!!");
console.log(data);
console.log(status);
},
error: function(xhr, desc, err) {
console.log(xhr);
alert('fail')
console.log("Desc: " + desc + "\nErr:" + err);
}
});
编辑:为了更清楚,我可以直接进入并注释掉setRequestHeader函数,并发送消息POST。
答案 0 :(得分:3)
您遇到的问题是因为使用AJAX时存在跨域限制。当您尝试设置授权标头时,浏览器会发出所谓的飞行前请求,以查看服务器是否接受来自此域的请求。
飞行前请求通常作为OPTIONS请求发送。如果您正在调用的服务器未返回与您的域匹配的Access-Control-Allow-Origin标头,则会阻止AJAX请求。 这里有更多内容:Cross-Origin Resource Sharing
“用户代理可以通过预检请求发现跨域资源是否准备好使用非简单方法从给定来源接受请求。”
我遇到了同样的问题 - 根据您的情况,有一些可能的解决方法。 如果您有任何方法在第三方服务器上设置上述标题(某些应用程序/服务提供此功能),那么这可能是最简单的方法。
还有一个名为EasyXDM的javascript库可能对您有用,但同样,只有在您有权访问第三方服务器以上传该库的配置文件时才会使用它。
要调查的其他选项是PostMessage和跨域Iframe通信。后者更像是一个老派的黑客,前者是新浏览器的推荐方法。它不适用于IE6 / 7。
我们可能最终使用的选项是一个简单的代理 - 使用AJAX请求调用我们自己的服务器,并在服务器上调用第三方服务器。这完全避免了跨域问题,并且对我们的场景具有其他优势。
答案 1 :(得分:0)
我想这是Internet Explorer中的一个问题。在没有明确告知请求方法(POST | GET)的情况下,请求标头不包含IE中的自定义标头,但它可以在其他浏览器中使用。
然而尝试将此发布在jquery的bug中。也可以尝试其他浏览器。
编辑1:我认为这是jQuery 1.4.x中的一个错误....我现在报告了一个错误报告。
答案 2 :(得分:0)
当服务器不知道如何响应ajax请求时,会发生OPTIONS响应。
我看到它经常在尝试发布到第三方域名时发生(即跨网站发布)
OPTIONS方法表示请求获取有关Request-URI标识的请求/响应链上可用的通信选项的信息。此方法允许客户端确定与资源相关的选项和/或要求,或服务器的功能,而不会暗示资源操作或启动资源检索。
你试过了吗?