AJAX在Chrome发送选项,而不是GET / POST / PUT / DELETE?AJAX在

2019-05-09 01:00发布

我工作在工作中内部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"
});

Answer 1:

Chrome的预检寻找请求CORS标头。 如果请求是可以接受的,它会再发送实际的请求。 如果你这样做跨域,你只需要对付它或者找到一种方法,使请求非跨域。 这就是为什么jQuery的bug已被封闭,不需额外修复。 这是由设计。

不同于简单的请求(上面讨论的),“预检”请求首先被OPTIONS方法发送一个HTTP请求到资源上的其他域,以确定实际的请求是否是安全发送。 跨站点请求预检这样的,因为它们可能具有对用户数据的影响。 特别地,一个请求被预检如果:

  • 它采用了比GET,HEAD或POST等方法。 此外,如果POST用于与比应用程序以外的内容类型发送请求数据/ X WWW的窗体-urlencoded,多部分/格式数据,或文本/无格式,例如,如果POST请求发送一个XML有效载荷到服务器利用应用程序/ xml或文本/ XML,则该请求被预检。
  • 它设置自定义首部的请求(例如,请求使用的报头,如X PINGOTHER)


Answer 2:

基于这样的事实,该请求不被默认端口80/443这个Ajax调用自动视为一个跨域资源(CORS)的要求 ,这在其他的话是说,请求自动发出OPTIONS请求其检查的发在服务器的/ servlet的侧CORS标头。

发生这种情况即使你设置

crossOrigin: false;

或者即使你ommit它。

原因很简单,就是localhost != localhost:57124 。 尝试发送它只有localhost未经口岸-它会失败,因为要求的目标将是不可到达的, 但要注意的是,如果域名是相等的请求没有POST之前OPTIONS请求发送。



Answer 3:

我与凯文,乙双方同意,bug报告说,这一切。 这听起来像你试图让跨域Ajax调用。 :如果你不熟悉的同源策略,你可以从这里开始https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript 。

如果不打算成为一个跨域Ajax调用,尽量让你的目标URL相对的,看看问题是否会消失。 如果你真的绝望的面貌迈向JSONP,但要注意,混乱潜伏着。 实在没有更多的,我们可以做些什么来帮助你。



Answer 4:

如果有可能通过定期的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'];
}


Answer 5:

就我而言,我调用由AWS(API网关)主办的API。 当我试图从比API自己的域以外的域调用API发生错误。 由于我的API所有者我启用CORS测试环境,如所描述的亚马逊文档 。

在生产中不会出现这样的错误,因为请求和API将在同一个域中。

我希望它能帮助!



Answer 6:

作为回答的@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(); 
        }
    }


Answer 7:

“预检”请求先送由OPTIONS方法的HTTP请求到资源的其他域,以确定实际的请求是否是安全发送。 跨站点请求

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS



Answer 8:

考虑使用爱可信

axios.get( url,
{ headers: {"Content-Type": "application/json"} } ).then( res => {

  if(res.data.error) {

  } else { 
    doAnything( res.data )
  }

}).catch(function (error) {
   doAnythingError(error)
});

我有本次发行采用取和爱可信完美。



Answer 9:

我遇到一个非常类似的问题。 我花了差不多半天明白为什么一切正常在Firefox和Chrome浏览器失败。 在我的情况,这是因为在我的请求头复制(或者输入错误的)领域。



文章来源: AJAX in Chrome sending OPTIONS instead of GET/POST/PUT/DELETE?