Perl调用curl执行PUT请求返回411 Content Length错误求助
核心原因
你遇到的411错误最根本的原因是Perl反引号内的特殊符号没有转义:@在Perl中是数组的标识符,你写的-d @output.json会被Perl优先解析为数组@output插值拼接.json,如果你的Perl代码中没有定义过@output数组,最终传递给curl的参数会变成-d .json,请求体内容完全不符合预期,curl无法计算正确的Content-Length,触发Azure API的411错误。
另外你贴出的Perl代码末尾错误使用单引号闭合反引号,也会导致命令解析异常。
修复方案
方案1:直接修正反引号写法(最简单)
对@符号添加反斜杠转义,同时修正命令闭合符号,示例代码如下:
# 注意@前加\转义,末尾用反引号闭合而不是单引号 $lb_update = `curl -H "Content-Type:application/json" -H "Authorization: Bearer $authtoken" -X PUT "https://management.azure.com/subscriptions/<subscription-ID>/resourceGroups/<resource-group>/providers/Microsoft.Network/loadBalancers/<load-balancer>?api-version=$apiversion" -d \@output.json`;
如果$authtoken和$apiversion是bash环境变量而非Perl变量,还需要对$符号也进行转义,写成\$authtoken和\$apiversion,避免被Perl提前解析为空值。
方案2:用列表形式调用curl(避免转义问题)
如果你不想处理复杂的转义规则,可以用列表形式执行命令,完全规避Perl插值和shell解析的干扰,推荐用IPC::System::Simple模块的capture方法:
use IPC::System::Simple qw(capture); $lb_update = capture( 'curl', '-H', 'Content-Type:application/json', '-H', "Authorization: Bearer $authtoken", '-X', 'PUT', "https://management.azure.com/subscriptions/<subscription-ID>/resourceGroups/<resource-group>/providers/Microsoft.Network/loadBalancers/<load-balancer>?api-version=$apiversion", '-d', '@output.json' );
方案3:改用Perl原生HTTP客户端(更稳定)
如果不想依赖系统的curl命令,可以用Perl原生的HTTP客户端模块发起请求,可控性更高:
use LWP::UserAgent; # 读取本地json文件内容 open my $fh, '<', 'output.json' or die "读取output.json失败: $!"; my $req_body = do { local $/; <$fh> }; close $fh; my $ua = LWP::UserAgent->new; my $resp = $ua->put( "https://management.azure.com/subscriptions/<subscription-ID>/resourceGroups/<resource-group>/providers/Microsoft.Network/loadBalancers/<load-balancer>?api-version=$apiversion", 'Content-Type' => 'application/json', 'Authorization' => "Bearer $authtoken", Content => $req_body ); if ($resp->is_success) { $lb_update = $resp->decoded_content; } else { die "请求失败: " . $resp->status_line; }
内容的提问来源于stack exchange,提问作者jay patel
相关产品推荐
相关产品推荐

