为什么使用 qs 处理 POST 数据
axios 的 POST 请求默认将 JavaScript 对象序列化为 JSON 格式(Content-Type: application/json
)。但某些后端接口(尤其是传统表单提交)要求数据以 application/x-www-form-urlencoded
格式传输,此时需要使用 qs
库将对象转换为 URL 编码的字符串。
qs
的作用是将嵌套对象转换为键值对形式,例如:
javascript
{ a: 1, b: { c: 2 } }
// 转换为 a=1&b%5Bc%5D=2(即 b[c]=2 的 URL 编码)
典型场景:
- 后端接口仅支持
x-www-form-urlencoded
格式。 - 需要处理多层嵌套对象或数组的复杂数据结构。
- 需要兼容老式表单提交逻辑。
何时不需要使用 qs
如果接口支持 JSON 格式(现代 API 的常见方式),直接传递 JavaScript 对象即可,无需转换:
javascript
axios.post('/api', { name: 'John', age: 30 })
// 自动转为 JSON:{"name":"John","age":30}
其他情况:
- 后端明确要求
multipart/form-data
(如文件上传)时,需使用FormData
对象。 - 数据本身已是字符串或
URLSearchParams
对象。
代码示例对比
使用 qs:
javascript
import qs from 'qs';
axios.post('/api', qs.stringify({ user: { name: 'John' } }), {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
// 发送数据:user%5Bname%5D=John
不使用 qs:
javascript
axios.post('/api', { user: { name: 'John' } });
// 发送数据:{"user":{"name":"John"}}
注意事项
- 检查后端接口的
Content-Type
要求。 - 数组或嵌套对象需确认后端解析规则,
qs
可通过配置调整序列化方式(如qs.stringify({ arr: [1,2] }, { indices: false })
生成arr=1&arr=2
)。 - URL 编码可能存在特殊字符(如
[]
)的兼容性问题,需与后端对齐。