如何在不调用Chrome的CORS预检请求的情况下指定“ application / json”内容类型?

时间:2019-06-28 19:16:46

标签: javascript google-chrome cors fetch

根据提取规范,似乎只要指定Content-Type为“ application / x-www-form-urlencoded”,“ multipart / form-data”或“ text / ”并满足其他条件,则POST请求不应导致预检请求。但是在实践中,我很难指定要提取的多个标头,而不会导致OPTIONS请求进行预检检查。

例如1。

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: {
        "Content-Type": "text/plain, application/json",
        Accept: "application/json"
    },
    method: "POST",
    body: JSON.stringify({})
})

例如2。

var myHeaders = new Headers();
myHeaders.append('Accept', 'application/json');
myHeaders.append('Content-Type', 'text/plain');
myHeaders.append('Content-Type', 'application/json');

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: myHeaders,
    method: "POST",
    body: JSON.stringify({})
})

例如3。

fetch("https://differentsubodmain.example.com/api/resource", {
    headers: [
        ["Content-Type", "application/json"],
        ["Content-Type", "text/plain"],
        ["Accept", "application/json"]
    ],
    method: "POST",
    body: JSON.stringify({})
    })

在没有预检请求的情况下,这两个示例都无法成功请求,但是仅使用"Content-Type": "text/plain"进行指定似乎都可以。 example here会同时显示请求中已指定的两个位置,并建议不要引起预检。这仅仅是浏览器实现不同的问题,还是我缺少一些东西?

1 个答案:

答案 0 :(得分:1)

似乎我没有仔细阅读该参考资料。以下是重要摘录。

  

警告。故意不使用提取MIME类型,因为该算法是宽容的,并且不希望服务器实现它。

     

如果使用了提取MIME类型,则以下请求将不会导致CORS预检,并且服务器上的简单解析器可能会将请求正文视为JSON

看来我们在很大程度上受制于application/x-www-form-urlencodedmultipart/form-datatext/plain的mime类型,以避免对CORS进行飞行前请求。

参考: