為什么使用 qs 處理 POST 數據
axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式(Content-Type: application/json
)。但某些后端接口(尤其是傳統表單提交)要求數據以 application/x-www-form-urlencoded
格式傳輸,此時需要使用 qs
庫將對象轉換為 URL 編碼的字符串。
qs
的作用是將嵌套對象轉換為鍵值對形式,例如:
{ a: 1, b: { c: 2 } }
// 轉換為 a=1&b%5Bc%5D=2(即 b[c]=2 的 URL 編碼)
典型場景:
- 后端接口僅支持
x-www-form-urlencoded
格式。 - 需要處理多層嵌套對象或數組的復雜數據結構。
- 需要兼容老式表單提交邏輯。
何時不需要使用 qs
如果接口支持 JSON 格式(現代 API 的常見方式),直接傳遞 JavaScript 對象即可,無需轉換:
axios.post('/api', { name: 'John', age: 30 })
// 自動轉為 JSON:{"name":"John","age":30}
其他情況:
- 后端明確要求
multipart/form-data
(如文件上傳)時,需使用FormData
對象。 - 數據本身已是字符串或
URLSearchParams
對象。
代碼示例對比
使用 qs:
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:
axios.post('/api', { user: { name: 'John' } });
// 發送數據:{"user":{"name":"John"}}
注意事項
- 檢查后端接口的
Content-Type
要求。 - 數組或嵌套對象需確認后端解析規則,
qs
可通過配置調整序列化方式(如qs.stringify({ arr: [1,2] }, { indices: false })
生成arr=1&arr=2
)。 - URL 編碼可能存在特殊字符(如
[]
)的兼容性問題,需與后端對齊。