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之类的标头)
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,但要小心,潜在的混乱。我们真的没有什么可以帮你的了。我同意Kevin B的观点,缺陷报告说明了一切。听起来您正在尝试进行跨域ajax调用。如果您不熟悉同一原产地政策,可以从这里开始:
如果这不是一个跨域ajax调用,请尝试将目标url设置为相对的,看看问题是否消失。如果你真的很绝望,看看JSONP,但要小心,潜在的混乱。我们真的没有什么可以为您提供帮助。基于请求不是在默认端口80/443上发送的事实,此Ajax调用自动被视为跨源资源(CORS)请求,换句话说,这意味着请求会自动发出一个选项请求,检查服务器/servlet端的CORS头 即使设置了
crossOrigin: false;
或者即使你喜欢它
原因很简单,
localhost!=本地主机:57124
。尝试只将其发送到localhost
而不发送端口-它将失败,因为无法访问请求的目标,但是请注意,如果域名相等则发送请求时不使用POST前的OPTIONS请求。基于请求不是在默认端口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'];
}
如果可能,请使用不同的名称和名称通过常规GET/POST传递参数
axios.get( url,
{ headers: {"Content-Type": "application/json"} } ).then( res => {
if(res.data.error) {
} else {
doAnything( res.data )
}
}).catch(function (error) {
doAnythingError(error)
});
$.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);
}
});