如何基于CSV数据与XML模板批量发送HTTP PUT请求?
我来帮你完成这个批量发送HTTP PUT请求的Perl脚本,实现从CSV读取设备信息并替换XML模板内容,最终批量更新设备配置的功能。以下是完整的实现方案:
完整脚本代码
use strict; use warnings; use XML::Twig; use LWP::UserAgent; use HTTP::Headers; use HTTP::Request; use File::Slurp; use JSON -support_by_pp; use LWP 5.64; use MIME::Base64; use IO::Socket::SSL; use Text::CSV; # 推荐使用这个模块处理CSV,需提前安装:cpanm Text::CSV # 配置参数 my $xml_template_path = 'template.xml'; # 修正原脚本里的拼写错误:iemplate.xml my $csv_file_path = 'Input.csv'; my $api_endpoint = 'https://your-system-api-url/devices/'; # 替换为实际API地址,示例:/devices/{id} my $username = 'your_username'; # 若API需认证请填写实际用户名 my $password = 'your_password'; # 若API需认证请填写实际密码 # 创建UserAgent对象 my $ua = LWP::UserAgent->new( ssl_opts => { SSL_verify_mode => SSL_VERIFY_NONE(), verify_hostname => 0, } ); # 设置认证头(针对需要Basic认证的API) my $auth = encode_base64("$username:$password"); chomp $auth; my $headers = HTTP::Headers->new( 'Content-Type' => 'application/xml', 'Authorization' => "Basic $auth" ); # 初始化CSV处理器 my $csv = Text::CSV->new({ sep_char => ',', allow_whitespace => 1 # 处理CSV字段前后的空格 }) or die "Cannot use CSV: " . Text::CSV->error_diag(); # 读取XML模板 my $xml_twig = XML::Twig->new->parsefile($xml_template_path); $xml_twig->set_pretty_print('indented_a'); # 打开CSV文件并逐行处理 open(my $csv_fh, '<', $csv_file_path) or die "Could not open CSV file: $!"; # 跳过CSV表头(如果你的CSV第一行是id,name,ip请保留此行,否则删除) $csv->getline($csv_fh); while (my $row = $csv->getline($csv_fh)) { my ($device_id, $device_name, $device_ip) = @$row; # 清理数据(去除多余空格) $device_id =~ s/\s+//g; $device_name =~ s/^\s+|\s+$//g; $device_ip =~ s/^\s+|\s+$//g; # 复制XML模板,避免修改原模板内容 my $current_xml = $xml_twig->clone(); # 修改XML中的设备信息(请根据你的XML模板结构调整节点名称) # 示例:假设XML结构为<Device><ID>...</ID><Name>...</Name><IP>...</IP></Device> if (my $id_node = $current_xml->first_ancestor_or_self('ID')) { $id_node->set_text($device_id); } if (my $name_node = $current_xml->first_ancestor_or_self('Name')) { $name_node->set_text($device_name); } if (my $ip_node = $current_xml->first_ancestor_or_self('IP')) { $ip_node->set_text($device_ip); } # 生成最终的XML请求内容 my $xml_content = $current_xml->sprint(); # 构造PUT请求URL(根据你的API规则调整) my $put_url = $api_endpoint . $device_id; # 创建并发送PUT请求 my $request = HTTP::Request->new(PUT => $put_url, $headers, $xml_content); my $response = $ua->request($request); # 处理响应结果 if ($response->is_success) { print "Successfully updated device $device_id: " . $response->status_line . "\n"; } else { print "Failed to update device $device_id: " . $response->status_line . "\n"; print "Response content: " . $response->content . "\n"; } } close($csv_fh);
关键部分说明
- CSV处理:使用
Text::CSV模块可以安全处理包含空格或特殊字符的CSV数据,避免手动分割字符串的潜在问题。如果不想安装模块,也可以用split /\s*,\s*/, $line分割每行,但需确保CSV格式完全一致。 - XML模板修改:通过
XML::Twig的clone()方法复制模板,避免每次修改影响原模板。请根据你的template.xml实际结构,调整节点定位的代码(比如设备ID节点是<deviceId>,就把first_ancestor_or_self('ID')改成first_ancestor_or_self('deviceId'))。 - HTTP请求构造:设置正确的
Content-Type为application/xml,如果API需要认证,添加Basic Auth头。PUT请求的URL需根据系统API规则调整,通常是在基础地址后拼接设备ID。 - 错误处理:脚本加入了基础的错误捕获逻辑,比如文件打开失败、请求失败时输出详细信息,方便排查问题。
使用注意事项
- 修正原脚本中的拼写错误:将
iemplate.xml改为实际的模板文件名template.xml。 - 替换配置参数中的API地址、用户名、密码为实际值。
- 若CSV文件没有表头(第一行直接是设备数据),请删除
$csv->getline($csv_fh);这行代码。 - 生产环境中不建议跳过SSL证书验证(即
SSL_VERIFY_NONE和verify_hostname => 0),请配置正确的证书信任链。
内容的提问来源于stack exchange,提问作者StayCalm
相关产品推荐
相关产品推荐

