根据提取规范,似乎只要指定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会同时显示请求中已指定的两个位置,并建议不要引起预检。这仅仅是浏览器实现不同的问题,还是我缺少一些东西?
答案 0 :(得分:1)
似乎我没有仔细阅读该参考资料。以下是重要摘录。
警告。故意不使用提取MIME类型,因为该算法是宽容的,并且不希望服务器实现它。
如果使用了提取MIME类型,则以下请求将不会导致CORS预检,并且服务器上的简单解析器可能会将请求正文视为JSON
看来我们在很大程度上受制于application/x-www-form-urlencoded
,multipart/form-data
或text/plain
的mime类型,以避免对CORS进行飞行前请求。
参考: