如何通过Perl的WWW::Mechanize正确向API发送JSON数据
解决WWW::Mechanize发送PUT请求时JSON被识别为HASH的问题
问题根源在于WWW::Mechanize的put方法如果直接接收HASH作为Content参数,会默认将其解析为表单数据(application/x-www-form-urlencoded格式),哪怕你设置了Content-Type: application/json也没用——因为它先把HASH转成了表单编码格式,再发送请求。
要正确发送JSON数据,你需要手动将HASH序列化为JSON字符串,再传递给Content参数,同时确保Content-Type头设置正确。
步骤1:确认JSON序列化模块
Perl自带JSON::PP核心模块,无需额外安装;如果追求更高性能,也可以安装JSON::XS:
# 安装JSON::XS(可选) cpanm JSON::XS
步骤2:修改脚本代码
错误写法(导致HASH被识别为表单数据):
use WWW::Mechanize; my $mech = WWW::Mechanize->new; my $payload = { name => "Alice", age => 30 }; # 错误:直接传HASH,会被转成表单格式 $mech->put( 'https://your-api-endpoint.com', Content_Type => 'application/json', Content => $payload );
正确写法(序列化HASH为JSON字符串):
use WWW::Mechanize; use JSON::PP; # 或者 use JSON::XS; my $mech = WWW::Mechanize->new; my $payload = { name => "Alice", age => 30 }; # 将HASH序列化为JSON字符串 my $json_str = encode_json($payload); $mech->put( 'https://your-api-endpoint.com', 'Content-Type' => 'application/json', Content => $json_str );
额外调试技巧
如果仍有问题,可以打印请求详情排查:
use Data::Dumper; # 打印请求头和内容 print "Request Headers:\n"; print Dumper($mech->request->headers); print "\nRequest Content:\n"; print $mech->request->content;
这样修改后,API收到的就是标准JSON格式的请求体,和curl调用时的格式完全一致。
内容的提问来源于stack exchange,提问作者NPatel
相关产品推荐
相关产品推荐

