Javascript 为什么CORS对不同的内容类型给出不同的响应

Javascript 为什么CORS对不同的内容类型给出不同的响应,javascript,xmlhttprequest,cors,content-type,Javascript,Xmlhttprequest,Cors,Content Type,当在没有请求内容类型的情况下调用第三方域的服务器时,我得到一个CORS错误并且没有响应。但是,当使用内容类型text/plain(这是响应的真正内容类型)进行调用时,我得到了一个响应,但出现了CORS错误,因此我无法将其解析到dom。问题是,为什么会有第二次而不是第一次的回应。两者都是CORS的错误。在收到服务器的响应后,如何在第二次解析错误 <!DOCTYPE html> <html lang="en"> <head> <meta c

当在没有请求内容类型的情况下调用第三方域的服务器时,我得到一个CORS错误并且没有响应。但是,当使用内容类型text/plain(这是响应的真正内容类型)进行调用时,我得到了一个响应,但出现了CORS错误,因此我无法将其解析到dom。问题是,为什么会有第二次而不是第一次的回应。两者都是CORS的错误。在收到服务器的响应后,如何在第二次解析错误

   <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script>
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://www.w3schools.com/xml/ajax_info.txt', true);
        xhr.setRequestHeader('content-type', undefined);
        xhr.onload = function () {
            console.log('Test');
        };
        xhr.send(null);
        var contentXHR = new XMLHttpRequest();
        contentXHR.open('GET', 'http://www.w3schools.com/xml/ajax_info.txt', true);
        contentXHR.setRequestHeader('content-type', 'text/plain');
        contentXHR.onload = function () {
            console.log('Test request header');
        };
        contentXHR.send(null);
    </script>
  </head>
    <body>
            Check console and network tab
    </body>
</html>

var xhr=new XMLHttpRequest();
xhr.open('GET','http://www.w3schools.com/xml/ajax_info.txt",对),;
xhr.setRequestHeader('content-type',未定义);
xhr.onload=函数(){
console.log('Test');
};
xhr.send(空);
var contentXHR=new XMLHttpRequest();
contentXHR.open('GET','http://www.w3schools.com/xml/ajax_info.txt",对),;
setRequestHeader('content-type','text/plain');
contentXHR.onload=函数(){
log(“测试请求头”);
};
contentXHR.send(空);
检查控制台和网络选项卡


如果未指定
内容类型
,XHR将执行
CORS飞行前请求
。请注意,您的请求是
OPTIONS
,而不是
GET
。这就是为什么您没有从“网络”选项卡获得任何响应

根据:

如果报头字段名为,则称报头为简单报头 Accept、Accept语言或的ASCII不区分大小写匹配 内容语言,或者如果它是不区分大小写的ASCII匹配 内容类型和标题字段值媒体类型(不包括 参数)是的ASCII不区分大小写匹配项 application/x-www-form-urlencoded、多部分/表单数据或text/plain

(……)

如果资源作者想成为 能够使用非简单的方法处理跨来源请求 方法
。在这种情况下,作者需要回复飞行前请求 它使用OPTIONS方法,然后需要处理实际的 使用所需方法的请求(本例中删除)并给出 适当的回应


总之,如果您的内容类型不同于
应用程序/x-www-form-urlencoded
多部分/表单数据
、或
文本/普通
,那么XHR将触发预飞行(发送
选项
http动词)。

我同意您的观点@jaromanda-x,网络选项卡多次出现。我注意到了。我知道这基本上是一个警告。但如果查看响应,第一个XHR请求没有来自服务器的响应,但第二个XHR请求有响应,但没有从浏览器解析。我想知道的是——我是否可以解析第二次出现的响应,如果是,如何解析。或者,如果我无法解析响应,那么如何解析CORS错误的控制台警告。我需要做任何一个。我不想在不安全模式下运行浏览器,也不想创建chrome/firefox/edge应用程序。那肯定是个失误。我不能解析响应吗?那么我如何使用JS解析CORS错误的控制台警告?我也不希望有状态代码。但这是正常的。这就是我的异步代码的发展方向。你能再检查一遍代码吗。它实际上给了我200的地位。Loadend被触发状态为200的Loadend事件被触发
var contentXHR=new XMLHttpRequest();contentXHR.open('GET','http://www.w3schools.com/xml/ajax_info.txt",对),;setRequestHeader('content-type','text/plain');contentXHR.onloadend=函数(){console.log('Test request header');};contentXHR.send(空)啊,这是我这边的一个重大失误。我可以在普通安全模式设置浏览器中从Javascript代码解析/捕获console CORS错误吗?@Gary您无法访问/解析此消息。您可以设置
contentXHR.onerror
回调,但它会在发生正常错误时触发(包括CORS保护)。你可以检查这些问题,也许可以帮助你。很酷,谢谢。我认为这些链接很有帮助。这可能就是我要找的。