Request Post与Axios Post请求结果差异:401错误排查
解决Axios替换Request后出现401内部服务错误的问题
这种情况我碰到过不少,大概率是Request和Axios在请求数据格式、请求头上的默认差异导致的——毕竟你之前用request.post时特意用了form选项,而Axios的默认处理逻辑和它完全不同。结合你的代码,我给你梳理几个最可能的原因和解决办法:
1. 请求数据格式不匹配(最常见原因)
你原来的Request代码里用了{form: {id: 1, user: 1}},这个form选项会告诉Request:
- 自动把请求的
Content-Type设为application/x-www-form-urlencoded - 把对象编码成表单格式(比如
id=1&user=1)发送给后端
但Axios默认会把传入的对象序列化为JSON格式,同时设置Content-Type为application/json。如果后端只接受表单格式的请求,就会因为无法正确解析参数,甚至无法识别鉴权相关信息,最终返回401错误。
解决办法:让Axios发送表单格式的数据
你可以用qs库(Axios生态常用的工具)来编码数据,手动设置对应的请求头:
// 先安装qs:npm install qs 或 yarn add qs import qs from 'qs'; // 替换你的Axios请求代码 response = yield axios.post(api, qs.stringify({id: 1, user: 1}), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
或者用原生的FormData对象:
const formData = new FormData(); formData.append('id', 1); formData.append('user', 1); response = yield axios.post(api, formData);
2. 请求头存在差异
Request和Axios的默认请求头可能不同,比如User-Agent、是否携带某些默认字段,这些差异可能导致后端的鉴权逻辑不通过。
解决办法:对齐Request的请求头
你可以先通过抓包工具(比如Chrome DevTools的Network面板、Charles)查看原来Request请求的所有请求头,然后在Axios里手动配置相同的头:
response = yield axios.post(api, qs.stringify({id: 1, user: 1}), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': '原来的Request的User-Agent值', // 其他必要的请求头,比如Cookie、Authorization等 } });
3. 鉴权信息未正确传递
如果你的请求依赖Cookie、Token这类鉴权信息,Request可能在全局配置里自动携带了这些内容,但Axios没有配置,导致后端无法识别你的身份,返回401。
解决办法:配置Axios的鉴权信息
- 如果是Cookie鉴权:确保Axios开启了
withCredentials(和Request的jar选项类似):
response = yield axios.post(api, qs.stringify({id: 1, user: 1}), { withCredentials: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
- 如果是Token鉴权:检查Request是否在请求头里携带了
Authorization,然后在Axios里添加对应的头:
const yourToken = '你的鉴权Token'; response = yield axios.post(api, qs.stringify({id: 1, user: 1}), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Bearer ${yourToken}` // 格式根据实际情况调整 } });
建议你先从第一个原因入手排查,这是最容易踩坑的点,大概率能解决问题。
内容的提问来源于stack exchange,提问作者user9728810
相关产品推荐
相关产品推荐

