我工作在工作中内部Web应用程序。 在IE10的要求做工精细,但在Chrome中所有的AJAX请求(其中有很多)使用选项,而不是什么定义方法我给它发送。 技术上我的要求是“跨域”。 该网站供应在localhost:6120和服务我正在AJAX请求是在57124. 这个封闭的jQuery的错误定义的问题,而不是一个真正的解决。
我能做些什么来使用Ajax请求适当的HTTP方法?
编辑:
这是每一个页面的文件装载:
jQuery.support.cors = true;
而每AJAX同样内置:
var url = 'http://localhost:57124/My/Rest/Call';
$.ajax({
url: url,
dataType: "json",
data: json,
async: true,
cache: false,
timeout: 30000,
headers: { "x-li-format": "json", "X-UserName": userName },
success: function (data) {
// my success stuff
},
error: function (request, status, error) {
// my error stuff
},
type: "POST"
});
Chrome的预检寻找请求CORS标头。 如果请求是可以接受的,它会再发送实际的请求。 如果你这样做跨域,你只需要对付它或者找到一种方法,使请求非跨域。 这就是为什么jQuery的bug已被封闭,不需额外修复。 这是由设计。
不同于简单的请求(上面讨论的),“预检”请求首先被OPTIONS方法发送一个HTTP请求到资源上的其他域,以确定实际的请求是否是安全发送。 跨站点请求预检这样的,因为它们可能具有对用户数据的影响。 特别地,一个请求被预检如果:
- 它采用了比GET,HEAD或POST等方法。 此外,如果POST用于与比应用程序以外的内容类型发送请求数据/ X WWW的窗体-urlencoded,多部分/格式数据,或文本/无格式,例如,如果POST请求发送一个XML有效载荷到服务器利用应用程序/ xml或文本/ XML,则该请求被预检。
- 它设置自定义首部的请求(例如,请求使用的报头,如X PINGOTHER)
基于这样的事实,该请求不被默认端口80/443这个Ajax调用自动视为一个跨域资源(CORS)的要求 ,这在其他的话是说,请求自动发出OPTIONS请求其检查的发在服务器的/ servlet的侧CORS标头。
发生这种情况即使你设置
crossOrigin: false;
或者即使你ommit它。
原因很简单,就是localhost != localhost:57124
。 尝试发送它只有localhost
未经口岸-它会失败,因为要求的目标将是不可到达的, 但要注意的是,如果域名是相等的请求没有POST之前OPTIONS请求发送。
我与凯文,乙双方同意,bug报告说,这一切。 这听起来像你试图让跨域Ajax调用。 :如果你不熟悉的同源策略,你可以从这里开始https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript 。
如果不打算成为一个跨域Ajax调用,尽量让你的目标URL相对的,看看问题是否会消失。 如果你真的绝望的面貌迈向JSONP,但要注意,混乱潜伏着。 实在没有更多的,我们可以做些什么来帮助你。
如果有可能通过定期的GET / POST使用不同的名称通过PARAMS,让你的服务器端代码处理。
我也有类似的问题,我自己的代理服务器绕过CORS和我POST-> OPTION的同样的错误在Chrome中。 这是Authorization
在我的情况(首部"x-li-format"
和"X-UserName"
在这里你的情况)。最后我通过它在一个虚拟的格式(例如AuthorizatinJack
在GET),我改变了代码为我的代理进行调用到目的地时,把它转换成一个头。 这是在PHP中:
if (isset($_GET['AuthorizationJack'])) {
$request_headers[] = "Authorization: Basic ".$_GET['AuthorizationJack'];
}
就我而言,我调用由AWS(API网关)主办的API。 当我试图从比API自己的域以外的域调用API发生错误。 由于我的API所有者我启用CORS测试环境,如所描述的亚马逊文档 。
在生产中不会出现这样的错误,因为请求和API将在同一个域中。
我希望它能帮助!
作为回答的@Dark猎鹰,我只是处理它 。
就我而言,我使用Node.js的服务器,如果它不存在,创建一个会话。 由于OPTIONS方法没有在它的会话细节,它结束了创建为每个POST方法请求一个新的会话。
所以在我的应用程序创建会话-如果-不存在,我只是增加了一个检查,看是否方法OPTIONS
,如果是这样,就跳过会话创建部分:
app.use(function(req, res, next) {
if (req.method !== "OPTIONS") {
if (req.session && req.session.id) {
// Session exists
next();
}else{
// Create session
next();
}
} else {
// If request method is OPTIONS, just skip this part and move to the next method.
next();
}
}
“预检”请求先送由OPTIONS方法的HTTP请求到资源的其他域,以确定实际的请求是否是安全发送。 跨站点请求
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
考虑使用爱可信
axios.get( url,
{ headers: {"Content-Type": "application/json"} } ).then( res => {
if(res.data.error) {
} else {
doAnything( res.data )
}
}).catch(function (error) {
doAnythingError(error)
});
我有本次发行采用取和爱可信完美。
我遇到一个非常类似的问题。 我花了差不多半天明白为什么一切正常在Firefox和Chrome浏览器失败。 在我的情况,这是因为在我的请求头复制(或者输入错误的)领域。