Axios GET请求忽略application/json类型Content-Type如何解决
问题原因
Axios 内部默认对GET、HEAD这类语义上无请求体的请求做了特殊处理:会自动移除这类请求上手动配置的Content-Type请求头,同时默认不会处理data字段配置的内容作为请求体发送,这就是手动设置头不生效的核心原因。
这个逻辑本身是符合HTTP标准规范的——标准中GET请求的作用是获取资源,不应该携带请求体,所以框架默认判定这类请求不需要Content-Type头。这也是把请求改成POST之后就能正常响应的原因:POST属于语义上携带请求体的方法,Axios不会移除它的Content-Type头,会正常处理data的序列化逻辑。
解决方案
根据后端要求(必须GET请求+Content-Type: application/json),有两种可行配置方式:
- 方案1:强制保留请求头+处理请求体(适配后端要求GET携带JSON请求体的场景)
重写transformRequest配置,绕开Axios的默认移除逻辑,手动设置请求头并序列化请求体。注意不要提前手动对data做JSON.stringify处理,避免双重序列化导致后端解析失败,代码示例:
export const getPrivateInstance = axios.create({ baseURL: API_URL, timeout: 25000, withCredentials: true }) getPrivateInstance({ method: 'get', url: "/getData", data: { projectId: projectID }, headers: { "Content-Type": 'application/json', }, // 关键配置:重写请求转换逻辑 transformRequest: [ function (data, headers) { // 强制设置Content-Type,避免被Axios默认逻辑移除 headers['Content-Type'] = 'application/json'; // 序列化JSON数据,作为请求体返回 return JSON.stringify(data); } ] })
注意:部分浏览器、代理服务器、网关组件会直接丢弃GET请求携带的请求体,使用前请确认全链路支持GET请求带请求体的非标准写法,避免出现偶发请求失败问题。
- 方案2:参数改放URL查询串(更符合HTTP规范的可选方案)
如果后端允许调整参数接收逻辑,可以把参数放到params字段中自动拼接到URL后,这种方式不需要传递请求体,但如果后端强制要求GET请求必须携带Content-Type: application/json头,依然需要在transformRequest中手动设置头避免被移除,代码示例:
getPrivateInstance({ method: 'get', url: "/getData", // 参数会自动拼接到URL后,格式为 /getData?projectId=xxx params: { projectId: projectID }, headers: { "Content-Type": 'application/json', }, transformRequest: [ function (data, headers) { headers['Content-Type'] = 'application/json'; return data; } ] })
内容的提问来源于stack exchange,提问作者thelearner
相关产品推荐
相关产品推荐

