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

如何基于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。
  • 错误处理:脚本加入了基础的错误捕获逻辑,比如文件打开失败、请求失败时输出详细信息,方便排查问题。
使用注意事项
  1. 修正原脚本中的拼写错误:将iemplate.xml改为实际的模板文件名template.xml。
  2. 替换配置参数中的API地址、用户名、密码为实际值。
  3. 若CSV文件没有表头(第一行直接是设备数据),请删除$csv->getline($csv_fh);这行代码。
  4. 生产环境中不建议跳过SSL证书验证(即SSL_VERIFY_NONE和verify_hostname => 0),请配置正确的证书信任链。

内容的提问来源于stack exchange,提问作者StayCalm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:43:26