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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:07:38