You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何指定application/json类型且不触发Chrome的CORS预检请求?

为什么你的多Content-Type请求会触发预检?

这事儿我之前也踩过类似的坑!核心问题出在你对Fetch「简单请求」的Content-Type规则理解得不够细——规范要求的是单一的、完全属于三个简单类型之一的Content-Type,而不是多个类型并存。

首先明确Fetch规范里无需预检的简单请求核心条件:对于POST请求,Content-Type必须是单一的以下类型之一:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:36:33