axios 的 GET 请求里,手动写 Content-Type: application/json 基本都会被删掉不是你写法错了是 axios 源码故意这么做的

一、为什么 GET 的 Content-Type 会被删掉

看 axios 源码(xhr.js)里的逻辑:

if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
  // Remove Content-Type if data is undefined
  delete requestHeaders[key];
}
  • GET 请求默认没有 datarequestData === undefined
  • 只要是 GET,你在 headers 里写的 Content-Type 会被直接删掉
  • HTTP 规范本来也规定:Content-Type 是描述请求体的,GET 不该有 body

所以下面这种写法永远不生效

// ❌ 无效
axios.get('/api', {
  headers: {
    'Content-Type': 'application/json'
  },
  params: { ... }
})

二、如果后端强行要这个头,怎么绕过

方案 1:请求拦截器里强行塞一个空 data(推荐)

axios.interceptors.request.use(config => {
  // 让 GET 也有 data,axios 就不会删 Content-Type
  if (config.method === 'get' && config.data === undefined) {
    config.data = null; // 或 {}、true 都行
  }
  // 再统一设置
  config.headers['Content-Type'] = 'application/json';
  return config;
});

之后正常写 get 即可:

axios.get('/api', { params: { ... } })

这时抓包会看到:

  • Content-Type: application/json
  • 不会真带 body,只是骗过 axios 的判断
方案 2:用 POST 伪装 GET(接口允许的话)

axios.post('/api', {}, {
  headers: { 'Content-Type': 'application/json' },
  params: { ... }
})
方案 3:全局默认头(配合拦截器)

axios.defaults.headers.common['Content-Type'] = 'application/json';

再配合上面拦截器给 GET 塞个 data,就能全局生效。


三、要不要这么做?

  • 正常 RESTful 接口:不需要。GET 就不该有 Content-Type,后端设计不合理。
  • 老旧 / 第三方接口:没办法,只能用上面拦截器的方式硬塞

简单总结:axios 会自动删除 GET 请求的 Content-Type,因为 GET 无 body。要强行保留,就在请求拦截器里给 GET 塞一个 data(null/{}),再统一设置 Content-Type 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值