Chrome中的AJAX发送OPTIONS而不是GET / POST / PUT / DELETE?
我正在工作的内部Web应用程序。 在IE10中的请求工作正常,但在Chrome中,所有的AJAX请求(有很多)使用OPTIONS发送,而不是我给定的任何定义的方法。 技术上我的要求是“跨域”。 该网站在localhost:6120服务,我正在做的AJAX请求服务是在57124. 这个closures的jQuery的bug定义的问题,但不是一个真正的修复。
我能做些什么来在ajax请求中使用正确的http方法?
编辑:
这是在每个页面的文件加载:
jQuery.support.cors = true;
而且每个AJAX都是类似的构build的:
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标题的请求。 如果请求可以接受,则会发送真正的请求。 如果你正在做这个跨域,你只需要处理它,或者find一种方法来使请求非跨域。 这就是为什么jQuery的bug被closures为无法修复。 这是devise。
与上面讨论的简单请求不同,“预检”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否安全发送。 跨站点请求是这样预先考虑的,因为它们可能会影响用户数据。 特别是,如果出现以下情况,则会请求一个请求:
- 它使用GET,HEAD或POST以外的方法。 另外,如果使用POST来发送具有除application / x-www-form-urlencoded,multipart / form-data或text / plain之外的Content-Type的请求数据,例如,如果POST请求将XML有效载荷发送到服务器使用application / xml或text / xml,那么请求是预冲的。
- 它在请求中设置自定义标题(例如,请求使用X-PINGOTHER等标题)
根据请求未在缺省端口80/443上发送的事实, 这个Ajax调用被自动视为一个跨源资源(CORS)请求 ,换句话说,这意味着该请求会自动发出一个OPTIONS请求,该请求将检查服务器/ servlet侧的CORS头。
即使你设置了这种情况
crossOrigin: false;
或者即使你忽略它。
原因很简单,就是localhost != localhost:57124
。 尝试只发送到没有端口的localhost
– 它会失败,因为所请求的目标将无法访问, 但是请注意,如果域名相同 ,请求发送之前没有OPTIONS请求。
我同意凯文B,错误报告说这一切。 这听起来像你正在尝试进行跨域的Ajax调用。 如果您不熟悉相同的出处政策,您可以从这里开始: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript 。
如果这不是一个跨域Ajax调用,请尝试使您的目标url相对,看看问题是否消失。 如果你真的绝望的看着JSONP,但要小心,混乱潜伏。 真的没有什么可以帮助你的了。
如果可以通过不同名称的常规GET / POST传递参数,并让服务器端代码处理它。
我有一个类似的问题,我自己的代理绕过CORS,我得到了同样的错误POST-> OPTION在Chrome中。 这是我的情况下的Authorization
头(在你的情况下是"x-li-format"
和"X-UserName"
)。我最终以伪格式传递它(例如GET中的AuthorizatinJack
),并且改变了我的代码代理将呼叫转到目的地时将其转换为标题。 这里是在PHP中:
if (isset($_GET['AuthorizationJack'])) { $request_headers[] = "Authorization: Basic ".$_GET['AuthorizationJack']; }
就我而言,我打电话给由AWS(API网关)托pipe的API。 当我尝试从除API自己的域以外的域调用API时发生错误。 由于我是API所有者,所以我为testing环境启用了CORS,如Amazon文档中所述 。
在生产中,这个错误不会发生,因为请求和api将在同一个域中。
我希望它有帮助!
正如@Dark Falcon所回答的,我只是简单地处理了这个问题 。
在我的情况下,我正在使用node.js服务器,并创build一个会话,如果它不存在。 由于OPTIONS方法中没有会话详细信息,因此最终会为每个POST方法请求创build一个新的会话。
所以在我的应用程序例程创build会话如果不存在,我只是添加一个检查,看是否方法是OPTIONS
,如果是这样,只是跳过会话创build部分:
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(); } }
“preflighted”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际的请求是否安全发送。 跨网站请求
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
考虑使用axios
axios.get( url, { headers: {"Content-Type": "application/json"} } ).then( res => { if(res.data.error) { } else { doAnything( res.data ) } }).catch(function (error) { doAnythingError(error) });
我有这个问题使用获取和axios完美地工作。