You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Axios未配置paramsSerializer致请求失败问题

问题原因解析

核心问题出在参数的双重编码上,虽然你看到Axios日志里的URL一模一样,但实际发送的请求参数编码状态完全不同:

  • 第一种方案(直接给params的值套encodeURIComponent):
    Axios默认会对params对象做序列化处理(默认用Qs.stringify或者URLSearchParams),这就导致你手动编码过的内容会被二次编码。举个实际例子:如果用户名是user@test.com,你手动编码后得到user%40test.com,Axios默认序列化时会把其中的%再编码成%25,最终参数变成user%2540test.com。后端解析这个值时,得到的是user%40test.com而非原始的用户名,自然认证失败,返回CERT_AUTH_REQUIRED(估计后端把参数错误导致的认证失败,统一归到了证书认证相关的提示里)。

  • 第二种方案(自定义paramsSerializer):
    你自定义的序列化函数直接完成了参数的编码(顺便提一句:你贴的代码里直接encodeURIComponent(params)其实有问题,正确写法应该是把每个键值对分别编码后拼接,比如Object.entries(params).map(([k, v]) => ${encodeURIComponent(k)}=${encodeURIComponent(v)}).join('&'),大概率你实际用的是正确写法),跳过了Axios默认的二次编码步骤。后端拿到的是正确编码后的参数,能正常解析用户名密码,所以认证通过。

至于为什么日志显示URL相同?那是因为Axios日志会自动对URL做解码展示,你看到的是解码后的参数(比如user@test.com),但实际请求里,第一种是双重编码的字符串,第二种是单次编码的字符串,两者解码后看着一样,但原始编码内容不同,后端解析结果自然天差地别。

另外多说一句:POST请求里,敏感参数(比如密码)更适合放在请求体的data字段里,而不是URL的params里——毕竟URL会被存在各种日志里,安全性差很多。

内容的提问来源于stack exchange,提问作者TungTung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:38