【问题标题】:Ajax POST (CORS Enabled) Always ErroringAjax POST(启用 CORS)总是出错
【发布时间】:2017-08-30 02:32:27
【问题描述】:

我有以下函数来执行 ajax 发布请求

function POST(url, data) {
    $.ajax({
        'type' : "POST",
        'url' : url,
        'data' : data,
        headers : {
            'Access-Control-Request-Headers' : '*'
        },
        success : function(msg) {
            //alert('in success');
            //alert(msg);
            return msg;
        },
        error : function (xhr, status, error) {
            //alert(JSON.stringify(xhr));
            return 'error';
        }
    });
}

由于我的 CORS 配置,该函数总是返回错误。

我得到的错误总是

{"readyState":0,"status":0,"statusText":"error"}

我在启用了 Allow-Control-Allow-Origin 扩展的 Google Chrome 中尝试了相同的请求,并且请求顺利通过,所以我相当确信这完全是我的代码没有正确配置 CORS 的问题。

我做错了什么?

【问题讨论】:

  • 您要发布到 CORS 的服务器是否已启用?是否正确处理飞行前请求?
  • 我相信是这样,但它可以与提到的 Chrome 扩展一起使用,所以它必须是。
  • @yitzih http方法不应该像下面method: "POST"
  • “但它可以在启用了上述 Chrome 扩展程序的情况下使用,所以它必须是” - 这与正确的结论相反......这个扩展程序规避 CORS 限制,它是在服务器不允许的情况下启用此类请求的工具。因此,您使用此扩展程序的成功请求几乎可以证明您的服务器没有正确启用它。
  • 你的开发控制台告诉你什么?

标签: javascript jquery ajax cors


【解决方案1】:

你可以试试下面的方法吗

function POST(url, data) {
    $.ajax({
        method : "POST",
        url : url,
        data : data,
        crossDomain: true,
        beforeSend: function(xhrObj){
            //xhrObj.setRequestHeader("Content-Type","application/json");
            //xhrObj.setRequestHeader("Accept","application/json");
         xhrObj.setRequestHeader("Access-Control-Allow-Headers","x-requested-with");
        },
        success : function(msg) {
            //alert('in success');
            //alert(msg);
            return msg;
        },
        error : function (xhr, status, error) {
            //alert(JSON.stringify(xhr));
            return 'error';
        }
    });
}

如果您使用的是 jquery 1.5.2+,那么您需要添加以下标题

Access-Control-Allow-Headers: x-requested-with

【讨论】:

  • 我在crossDomain : true'Access-Control-Allow-Headers' : 'x-requested-with' 中添加了但仍然有同样的问题。 x-requested-with 是占位符还是该标题内容的实际文本? (我使用的是 JQuery 3.2.1)
  • @yitzih 更新了我的答案。您还可以使用beforeSend 将标头设置为键值对。请注意我的答案中缺少的单引号
  • @yitzih 你能在 console.log 的 ajax 调用中打印错误处理程序的status, error 吗?此外,您在 data 属性中发送的是哪种数据类型。服务器是否接受该数据类型?
【解决方案2】:

您确定 CORS 在后端接受所有来源吗?

再见:)

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2015-07-15
    • 1970-01-01
    • 2018-05-31
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多