Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在Chrome发送选项中使用AJAX而不是GET/POST/PUT/DELETE?_Jquery_Ajax_Cross Domain - Fatal编程技术网

Jquery 在Chrome发送选项中使用AJAX而不是GET/POST/PUT/DELETE?

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

我正在工作中开发一个内部web应用程序。在IE10中,请求可以正常工作,但在Chrome中,所有AJAX请求(有很多)都是使用选项发送的,而不是使用我定义的方法。从技术上讲,我的请求是“跨域”的。该站点是在localhost:6120上提供的,而我向其发出AJAX请求的服务是在57124上提供的。定义问题,但不是真正的修复

如何在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正在预处理请求以查找标题。如果请求可以接受,那么它将发送真正的请求。如果您正在跨域执行此操作,您只需处理它,或者找到一种方法使请求不跨域。这就是为什么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);
            }
        });