Kal*_*ico 50 javascript xmlhttprequest
我有这个代码:
net.requestXHR = function() {
this.xhr = null;
if(window.XMLHttpRequest === undefined) {
window.XMLHttpRequest = function() {
try {
// Use the latest version of the activex object if available
this.xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
}
catch(e1) {
try {
// Otherwise fall back on an older version
this.xhr = new ActiveXObject("Mxsml2.XMLHTTP.3.0");
}
catch(e2) {
//Otherwise, throw an error
this.xhr = new Error("Ajax not supported in your browser");
}
}
};
}
else
this.xhr = new XMLHttpRequest();
}
net.requestXHR.prototype.post = function(url, data) {
if(this.xhr != null) {
this.xhr.open("POST", url);
this.xhr.setRequestHeader("Content-Type", "application/json");
this.xhr.send(data);
}
}
var rs = new net.requestSpeech();
console.log(JSON.stringify(interaction));
rs.post("http://localhost:8111", JSON.stringify(interaction));
Run Code Online (Sandbox Code Playgroud)
当发送执行时,我有这个日志:
OPTIONS http://localhost:8111/ [HTTP/1.1 405 Method Not Allowed 74ms]
Run Code Online (Sandbox Code Playgroud)
而在localhost:8111我有一个接受帖子的reslet serverResource,它是同源策略的问题?我已修改restlet以放置allow-origin标头,我用另一个GET http请求(在jquery中)测试它并正常工作.我有相同原点解决的问题因为我使用html5浏览器而我的服务器将标题放在响应中,那么为什么send会显示这个错误?为什么要改变OPTION的POST?谢谢!
可能重复?:我认为不是,但确实如此,两个问题的问题都是一样的,但我的是指的是浏览器存在问题,另一个是指jquery.根据经验,时间不计算重复,答案是不同的,但两个问题相互补充是正确的.
Wla*_*ant 71
是的,这是"同源政策的问题".您正在向不同的服务器或不同的端口发出请求,这意味着它是跨站点HTTP请求.以下是文档对此类请求的说法:
此外,对于可能对服务器数据产生副作用的HTTP请求方法(特别是对于除某些MIME类型以外的HTTP方法
GET
或用于POST
某些MIME类型),规范要求浏览器"预检"请求,从而请求支持的方法.服务器使用HTTPOPTIONS
请求方法,然后,在服务器"批准"后,使用实际的HTTP请求方法发送实际请求.
CORS标准中有更详细的描述("预检交叉请求"部分).您的服务器需要允许OPTIONS
请求,并发送一个响应Access-Control-Allow-Origin
,Access-Control-Allow-Headers
并且Access-Control-Allow-Methods
头部允许请求.然后浏览器将发出实际POST
请求.
我从发送ajax内容的JavaScript代码中遇到了这个问题.
为了允许带有预检的跨源请求,我必须在收到请求的.ASPX中执行此操作:
//Check the petition Method
if (Request.HttpMethod == "OPTIONS")
{
//In case of an OPTIONS, we allow the access to the origin of the petition
string vlsOrigin = Request.Headers["ORIGIN"];
Response.AddHeader("Access-Control-Allow-Origin", vlsOrigin);
Response.AddHeader("Access-Control-Allow-Methods", "POST");
Response.AddHeader("Access-Control-Allow-Headers", "accept, content-type");
Response.AddHeader("Access-Control-Max-Age", "1728000");
}
Run Code Online (Sandbox Code Playgroud)
您必须小心并检查您的请求所要求的标题.我检查了那些使用Fiddler.
希望这能在将来为某人服务.
回答:
您的浏览器正在发起PreFlight OPTIONS请求。
为什么: 因为你的要求不是一个简单的要求。
为什么这不是一个简单的请求: 因为“Content-Type”=“application/json”。
解决方案: 尝试使用以下内容类型之一: