如何指定application/json类型且不触发Chrome的CORS预检请求?
为什么你的多Content-Type请求会触发预检?
这事儿我之前也踩过类似的坑!核心问题出在你对Fetch「简单请求」的Content-Type规则理解得不够细——规范要求的是单一的、完全属于三个简单类型之一的Content-Type,而不是多个类型并存。
首先明确Fetch规范里无需预检的简单请求核心条件:对于POST请求,Content-Type必须是单一的以下类型之一:
application/x-www-form-urlencodedmultipart/form-datatext/plain
你的三个示例都违反了「单一性」这个关键要求:
- 示例1:你把Content-Type设成了
"text/plain, application/json",这是逗号分隔的多个MIME类型,不属于规范规定的单一简单类型,浏览器直接判定这不是简单请求,触发预检。 - 示例2 & 3:你通过
Headers.append或者数组方式添加了两个Content-Type值,HTTP协议里重复的头字段会被自动合并成逗号分隔的列表(最终还是text/plain, application/json),同样不符合「单一简单类型」的要求,所以依然触发预检。
而当你只设置Content-Type: text/plain时,完全满足简单请求的所有条件,自然不会触发OPTIONS预检。
关于「同时指定两种类型不触发预检」的示例
你提到的那些示例大概率存在误解或者特殊场景:
- 可能示例里的「同时指定」并不是指同一个Content-Type头里有多个值,而是其他非Content-Type的请求头组合?
- 或者是一些旧浏览器的非标准实现?但现在主流浏览器(Chrome、Firefox、Safari)都是严格遵循Fetch规范的,这种多Content-Type的情况必然会触发预检。
总结
问题不是浏览器差异,而是你忽略了规范里对Content-Type的单一性要求。只要你的POST请求的Content-Type不是纯粹的、单一的那三个简单类型之一,就会触发预检请求。
内容的提问来源于stack exchange,提问作者jpierson
相关产品推荐
相关产品推荐

