如何使用Perl 5发起带Basic auth的POST请求调用REST API?
错误原因
Can't call method "clone" on unblessed reference报错是因为HTTP::Request->new的第三个请求头参数要求传入数组引用[],你最初传入的是哈希引用{},不符合模块参数要求,调整为数组引用后即可解决该问题。
完整可运行代码
除了请求头格式问题,你原代码还缺少发送HTTP请求的步骤,需要用LWP::UserAgent完成请求发送、响应接收逻辑,完整实现如下:
use strict; use warnings; use LWP::UserAgent; use JSON::MaybeXS qw(encode_json decode_json); use MIME::Base64 qw(encode_base64); # 配置凭证与接口地址 my $username = '你的用户名'; my $password = '你的密码'; my $url = 'https://testapi.com/webapi/AddData'; # 初始化UA my $ua = LWP::UserAgent->new; # 测试环境如果是自签名SSL证书可以打开下面配置,生产环境建议注释 # $ua->ssl_opts( verify_hostname => 0, SSL_verify_mode => 0 ); # 构造请求头:注意用数组引用,encode_base64第二个参数传空避免自动加换行 my $headers = [ 'Content-Type' => 'application/json; charset=UTF-8', 'Authorization' => 'Basic ' . encode_base64($username . ':' . $password, '') ]; # 构造请求体,encode_json直接输出UTF-8字节流,无需额外encode_utf8 my $post_data = { GroupName => 'City', Member => 'New York' }; my $encoded_data = encode_json($post_data); # 构造POST请求 my $request = HTTP::Request->new('POST', $url, $headers, $encoded_data); # 发送请求获取响应 my $response = $ua->request($request); # 处理响应 if ($response->is_success) { # 解析JSON响应 my $res_data = decode_json($response->decoded_content); # 提取ReturnValue字段 print "接口返回ReturnValue:" . $res_data->{ReturnValue} . "\n"; } else { print "请求失败,错误信息:" . $response->status_line . "\n"; # 调试时可以打印完整错误响应 # print $response->decoded_content . "\n"; }
注意事项
- 调用
encode_base64时要传入第二个空字符串参数,避免函数自动在末尾添加换行符,导致Authorization头格式错误 encode_json默认输出UTF-8编码的字节串,不需要额外嵌套encode_utf8,否则会导致中文重复编码出错- 生产环境不要关闭SSL证书校验,避免安全风险
内容的提问来源于stack exchange,提问作者Mr.Human
相关产品推荐
相关产品推荐

