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

Nuxt3 $fetch如何移除Content-Type中text/plain;charset=UTF-8

异常原因

这个现象是$fetch(即ofetch,底层依赖undici发起请求)的头信息合并逻辑bug导致的:

  • 当你直接给body参数传入普通JavaScript对象时,ofetch会自动触发JSON序列化逻辑,同时undici内部会先给未显式标记类型的请求体设置默认值text/plain;charset=UTF-8
  • 后续ofetch合并用户手动传入的请求头时,没有做同名头的覆盖处理,反而会把默认值和你手动设置的application/json用逗号做拼接,最终出现请求头里两个Content-Type值共存的情况。

这个问题可解决,不需要修改底层依赖,以下两种方案都可以完全移除多余的Content-Type片段:

可行解决方案
  • 方案1:提前序列化请求体,绕过自动头注入
    不要直接把JS对象传给body,提前用JSON.stringify把对象转成JSON字符串再传入。这种场景下ofetch不会触发自动对象序列化逻辑,也不会注入默认的text/plain头,会完全使用你手动设置的Content-Type: application/json。
    修正后的代码:
    const data = await $fetch('http://http-logger:3001/rpc/test_proc', {
      method: 'post',
      headers: {
        Prefer: 'params=single-object',
        Accept: 'application/json',
        'Content-Type':  'application/json'
      },
      body: JSON.stringify({some: 'json'})
    })
    
  • 方案2:移除手动设置的Content-Type,让ofetch自动注入正确头
    当传入对象类型body时,显式声明请求/响应类型为json,ofetch会自动设置正确的application/json头,不会追加text/plain片段,也不需要手动传Content-Type头。
    修正后的代码:
    const data = await $fetch('http://http-logger:3001/rpc/test_proc', {
      method: 'post',
      headers: {
        Prefer: 'params=single-object',
        Accept: 'application/json'
      },
      body: {some: 'json'},
      responseType: 'json'
    })
    

验证:两种方案调整后抓包,Content-Type会固定为application/json,不会再出现拼接的多余片段,PostgREST可以正常识别参数调用存储过程。

内容的提问来源于stack exchange,提问作者ianj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:06:24