使用Axios调用CGI接口时email、password参数无法被后端获取问题求助
问题原因
你浏览器直接访问链接时,发送的是GET请求,参数拼接在URL查询字符串中,Perl CGI模块的param()方法可以直接解析这类参数。
而你用Axios、Postman发送的是POST请求,Axios默认会把请求参数序列化为application/json格式放在请求体中,Perl CGI模块原生的param()方法不会自动解析JSON格式的请求体,所以读取出来的值是空的。
解决方法
方案1:修改前端Axios请求格式(无需改后端代码)
把POST请求的参数改为application/x-www-form-urlencoded格式发送,和表单提交的格式一致,CGI的param()方法可以直接解析。
可以用URLSearchParams或者qs库(Axios官方推荐的序列化工具)处理参数:
// 方法1:用URLSearchParams(无需额外引入库) const handleLogin = (data, setSubmitting) => { const url = 'https://mydesitte.or/register.cgi'; const params = new URLSearchParams(); params.append('email', data.email); params.append('password', data.password); axios .post(url, params) .then((response) => { alert(data.email); setSubmitting(false); }).catch(error => { alert(error); setSubmitting(false); }); } // 方法2:用qs库序列化(适合参数复杂的场景) // 先安装qs:npm install qs import qs from 'qs'; const handleLogin = (data, setSubmitting) => { const url = 'https://mydesitte.or/register.cgi'; axios .post(url, qs.stringify(data)) .then((response) => { alert(data.email); setSubmitting(false); }).catch(error => { alert(error); setSubmitting(false); }); }
方案2:修改后端CGI代码(适配JSON格式请求)
如果你希望后端支持JSON格式的POST请求,可以新增代码解析原始请求体中的JSON内容:
use CGI; use JSON; # 需要先安装Perl的JSON模块 my $cgi = new CGI; # 读取原始POST请求体 my $raw_input = $cgi->param('POSTDATA'); # 解析JSON为哈希结构 my $input_data = decode_json($raw_input); # 读取对应参数 my $email = $input_data->{email}; my $password = $input_data->{password};
测试注意事项
用Postman测试时需要和你选择的方案对应:
- 如果用方案1,POST请求的Body选择
x-www-form-urlencoded或者form-data格式填写参数 - 如果用方案2,POST请求的Body选择
raw,格式设置为JSON,填写JSON格式的参数
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

