Jquery 在Chrome发送选项中使用AJAX而不是GET/POST/PUT/DELETE?
我正在工作中开发一个内部web应用程序。在IE10中,请求可以正常工作,但在Chrome中,所有AJAX请求(有很多)都是使用选项发送的,而不是使用我定义的方法。从技术上讲,我的请求是“跨域”的。该站点是在localhost:6120上提供的,而我向其发出AJAX请求的服务是在57124上提供的。定义问题,但不是真正的修复 如何在ajax请求中使用适当的http方法 编辑: 这是在每页的文档加载中:Jquery 在Chrome发送选项中使用AJAX而不是GET/POST/PUT/DELETE?,jquery,ajax,cross-domain,Jquery,Ajax,Cross Domain,我正在工作中开发一个内部web应用程序。在IE10中,请求可以正常工作,但在Chrome中,所有AJAX请求(有很多)都是使用选项发送的,而不是使用我定义的方法。从技术上讲,我的请求是“跨域”的。该站点是在localhost:6120上提供的,而我向其发出AJAX请求的服务是在57124上提供的。定义问题,但不是真正的修复 如何在ajax请求中使用适当的http方法 编辑: 这是在每页的文档加载中: jQuery.support.cors = true; 每个AJAX的构建都是类似的: var
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正在预处理请求以查找标题。如果请求可以接受,那么它将发送真正的请求。如果您正在跨域执行此操作,您只需处理它,或者找到一种方法使请求不跨域。这就是为什么jQuery错误被关闭,因为它不会修复。这是故意的 与上面讨论的简单请求不同,“预飞行”请求优先 通过OPTIONS方法向上的资源发送HTTP请求 其他域,以确定实际请求是否安全 发送。跨站点请求是这样预处理的,因为它们可能 对用户数据有影响。特别是,请求是 如果:
- 它使用的方法不是GET、HEAD或POST。此外,如果POST用于发送内容类型不是的请求数据 application/x-www-form-urlencoded、多部分/表单数据或text/plain, e、 g.如果POST请求使用 application/xml或text/xml,则请求被预引导
- 它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)
我同意Kevin B的观点,缺陷报告说明了一切。听起来您正在尝试进行跨域ajax调用。如果您不熟悉同一原产地政策,可以从这里开始:
如果这不是一个跨域ajax调用,请尝试将目标url设置为相对的,看看问题是否消失。如果你真的很绝望,看看JSONP,但要小心,潜在的混乱。我们真的没有什么可以为您提供帮助。基于请求不是在默认端口80/443上发送的事实,此Ajax调用自动被视为跨源资源(CORS)请求,换句话说,这意味着请求会自动发出一个选项请求,检查服务器/servlet端的CORS头 即使设置了
crossOrigin: false;
或者即使你喜欢它
原因很简单,
localhost!=本地主机:57124
。尝试只将其发送到localhost
而不发送端口-它将失败,因为无法访问请求的目标,但是请注意,如果域名相等则在POST之前发送请求而不发送选项请求。如果可能,请使用不同的名称通过常规GET/POST传递参数,并让服务器端代码处理
我有一个类似的问题,我自己的代理绕过CORS,我得到了同样的错误后->选项在铬。在我的案例中是授权
头(“x-li-format”
和“x-UserName”
在您的案例中)。我最终以虚拟格式传递了它(例如GET中的authorizationjack
),我更改了代理的代码,以便在调用目标时将其转换为头。这里是PHP:
if (isset($_GET['AuthorizationJack'])) {
$request_headers[] = "Authorization: Basic ".$_GET['AuthorizationJack'];
}
在我的例子中,我正在调用由AWS(API网关)托管的API。错误发生在我试图从API自己的域以外的域调用API时。因为我是API所有者,所以我为测试环境启用了CORS,如中所述。 在生产中不会发生此错误,因为请求和api将位于同一个域中。 我希望有帮助 正如@Dark Falcon所说,我只是简单地处理了它 在我的例子中,我使用的是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();
}
}
“prefleed”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。跨站点请求
考虑使用
我在使用axios时遇到了这个问题,axios工作得非常好。我遇到了一个非常类似的问题。我花了将近半天的时间来理解为什么在Firefox中一切正常,而在Chrome中一切都失败了。在我的例子中,这是因为在我的请求头中重复了(或者可能键入错误)字段
$.ajax({
url: '###',
contentType: 'text/plain; charset=utf-8',
async: false,
xhrFields: {
withCredentials: true,
crossDomain: true,
Authorization: "Bearer ...."
},
method: 'POST',
data: JSON.stringify( request ),
success: function (data) {
console.log(data);
}
});
contentType:'text/plain;charset=utf-8',或者只是contentType:'text/plain',适合我!
问候 使用fetch而不是XHR,那么即使请求是跨域的,也不会被预授权。该bug报告中的最后一条注释解释得很好……它让我大吃一惊,因为我所做的一切都很普通(我的代码与jquery bug中的代码类似)。除此之外,这不是不包括它的借口。BRB,抓取一些示例代码。注意IE在确定请求是否是交叉源时不考虑端口号。@ KeviNb:我们的REST服务利用不同的请求来根据HTTP方法做不同的事情。切换所有内容以获取不是有效的解决方案。此外,根据Dark Falcon的回答,这不会有任何帮助,因为我在请求中有X-UserName和其他自定义标题。这不会改变这样一个事实,即如果你想提出跨源请求,你必须遵循适用于跨源请求的所有规则才能正常工作。跨来源请求通常涉及选项请求。手
$.ajax({
url: '###',
contentType: 'text/plain; charset=utf-8',
async: false,
xhrFields: {
withCredentials: true,
crossDomain: true,
Authorization: "Bearer ...."
},
method: 'POST',
data: JSON.stringify( request ),
success: function (data) {
console.log(data);
}
});