Javascript XMLHttpRequest更改POST to选项
我有以下代码:Javascript XMLHttpRequest更改POST to选项,javascript,xmlhttprequest,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
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));
执行发送时,我有以下日志:
OPTIONS http://localhost:8111/ [HTTP/1.1 405 Method Not Allowed 74ms]
在localhost:8111中,我有一个接受post的reslet服务器资源,这是同源策略的问题吗?我已经修改了restlet以放置allow-origin头,并使用另一个GET-http请求(在jquery中)对其进行了测试,结果正常。我有相同来源的问题,因为我使用html5浏览器,我的服务器在响应中放置了标题,那么为什么发送会显示此错误?为什么要为选项更改帖子?
谢谢
可能重复?:我认为没有,但这是真的,问题在于
这两个问题都一样,但我的问题是指
浏览器有问题,另一个问题首先指向
jquery。根据经验,时间不算作重复,而
答案是不同的,但两个问题都是互补的
彼此
是的,这是“同一原产地政策的问题”。您正在向其他服务器或其他端口发出请求,这意味着这是一个跨站点HTTP请求。以下是对此类请求的看法:
此外,对于HTTP请求方法,可能会对
服务器的数据(特别是对于HTTP方法而不是GET
,或
POST
使用某些MIME类型),规范要求
浏览器“预飞”请求,从
使用HTTPOPTIONS
请求方法的服务器,然后
来自服务器的“批准”,将实际请求与实际请求一起发送
HTTP请求方法
在(“带飞行前的交叉来源请求”部分)中有更详细的描述。服务器需要允许
选项
请求并发送带有访问控制允许来源
、访问控制允许标头
和访问控制允许方法
标头的响应,以允许请求。然后浏览器将发出实际的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");
}
你必须小心,检查你的请愿书的标题是什么。我用小提琴检查了一下
希望这能为将来的某个人服务。正如其他人所指出的,这是CORS的事情 这是如何在NGINX中处理它(基于): 如果要允许来自任何来源的CORS请求,请替换
add_header Access-Control-Allow-Origin "http://example.com";
与
如果不使用授权,则不需要此位:
add_header Access-Control-Allow-Headers "Authorization";
add_header Access-Control-Allow-Credentials "true";
对于我正在开发的API,我需要将3种请求方法列为白名单:GET、POST和OPTIONS,以及
X-App-Id
头,这就是我最终要做的:
if ($request_method = OPTIONS ) {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "X-App-Id";
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}
回答: 您的浏览器正在启动请求 原因: 因为你的请求不是一个好消息 为什么它不是一个简单的请求: 因为“内容类型”=“应用程序/json” 解决方案: 尝试使用以下任一内容类型:
- 应用程序/x-www-form-urlencoded
- 多部分/表单数据
- 文本/纯文本
add_header Access-Control-Allow-Headers "Authorization";
add_header Access-Control-Allow-Credentials "true";
if ($request_method = OPTIONS ) {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "X-App-Id";
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}