Fetch发送POST请求返回415 Unsupported Media Type(Postman正常)
415 Unsupported Media Type 问题排查与修复
核心触发原因:no-cors 模式篡改了请求头
- 你在请求配置里加的
mode: "no-cors"是最直接的问题来源:这是浏览器针对跨域请求的严格受限模式,该模式下浏览器不允许前端发送非“CORS安全列表”内的请求头,Content-Type: application/json就不属于安全可携带的类型范围。 - 浏览器会自动把你手动设置的
Content-Type值强制替换为text/plain;charset=UTF-8。Klaviyo的服务端收到请求时,检测到请求的媒体类型和接口要求的JSON格式不匹配,就会直接返回415错误。 - 你可以打开浏览器开发者工具的网络面板,找到这个请求的实际请求头参数,就能看到被篡改后的
Content-Type值,和你代码里设置的并不一致。
其余干扰请求的无效/错误配置
Access-Control-Allow-Origin本质是服务端返回给浏览器的响应头,不属于前端可以在请求中携带的字段,手动在请求里加这个头没有任何实际作用,还可能触发浏览器的安全校验拦截。- 代码中头部写入的
xxxxx_api_key值为空字符串,既没有实际鉴权作用,也和Postman里的可运行请求逻辑不匹配——Klaviyo的这个v2接口本身就要求api_key放在请求体中,不需要单独在头部做鉴权。 no-cors模式本身就不适合调用需要JSON交互的第三方接口:哪怕请求发出去了,前端JS也没有权限读取接口返回的响应内容,完全没法完成正常的业务逻辑处理。
可正常运行的调整步骤
- 从
requestOptions配置里删除mode: "no-cors",走默认的正常CORS请求模式,保证你手动设置的Content-Type: application/json头不会被浏览器篡改 - 删除无效的
Access-Control-Allow-Origin请求头 - 删除空值的鉴权头部字段,保持和Postman请求体里的参数结构完全一致
- 如果调整后依然遇到跨域报错,不要靠开启no-cors绕开限制,可以通过本地开发代理、后端中转转发的方式完成跨域请求,no-cors模式从根本上就无法正常处理JSON格式的POST交互。
内容的提问来源于stack exchange,提问作者Khalid
相关产品推荐
相关产品推荐

