【问题标题】:Multiple HTTP POST Requests with updated xml template具有更新的 xml 模板的多个 HTTP POST 请求
【发布时间】:2018-07-10 17:06:48
【问题描述】:

我想发出多个 HTTP POST 请求。我的 template.xml 用于从 Input.scv 数据上传 POST 请求,其中包含有关设备的信息,应添加这些信息(名称、IP 地址)。

Input.csv(名称、IP 地址)

LAB-1,10.26.0.1
LAB-2,10.26.0.2
LAB-3,10.26.0.3

模板.xml

<?xml version="1.0" encoding="UTF-8"?>
<ns0:networkdevice
        xmlns:ns0="network.ers.ise.cisco.com" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:ns1="ers.ise.cisco.com"
        xmlns:ers="ers.ise.cisco.com"
        name="name1">
    <authenticationSettings>
        <enableKeyWrap>true</enableKeyWrap>
        <keyEncryptionKey>1234567890123456</keyEncryptionKey>
        <keyInputFormat>ASCII</keyInputFormat>
        <networkProtocol>RADIUS</networkProtocol>
        <radiusSharedSecret>aaa</radiusSharedSecret>
    </authenticationSettings>
    <coaPort>1700</coaPort>
    <NetworkDeviceIPList>
        <NetworkDeviceIP>
            <ipaddress>1.1.1.1</ipaddress>
            <mask>32</mask>
        </NetworkDeviceIP>
    </NetworkDeviceIPList>
</ns0:networkdevice>

我现在已经更新了 XML,这是正确的。我现在需要将我的设备添加到管理系统。

   use strict;
   use warnings;
   use XML::Twig;
   use LWP::UserAgent;
   use HTTP::Headers;
   use HTTP::Request;
   use File::Slurp;
   use LWP 5.64;
   use MIME::Base64;
   use IO::Socket::SSL;

  my $xml = XML::Twig -> new -> parsefile ( 'template.xml' );
  $xml ->set_pretty_print('indented_a');

  open ( my $input, '<', 'input.csv' ) or die $!;

  while ( <$input> ) {
  chomp;
  my ( $name, $ip ) = split /,/;
  $xml -> root -> set_att('name', $name );
  $xml -> get_xpath('//ipaddress',0) -> set_text($ip);

  $xml -> sprint;

  #Create a user agent object
  my $ua = LWP::UserAgent->new(ssl_opts=> {
  SSL_verify_mode => SSL_VERIFY_NONE(),
  verify_hostname => 0,
  }
  );
  my $uri='https://hostname:9060/ers/config/networkdevice';
  my $req = HTTP::Request->new('POST', $uri, 
  [Accept=>'application/vnd.com.cisco.ise.network.networkdevice.1.1+xml',
  Content_Type=>'application/vnd.com.cisco.ise.network.networkdevice.1.1+xml; 
  charset=utf-8'], $xml);

  $req->content($xml);
  $req->authorization_basic("user", "user");

  #Pass request to the user agent and get a response back
  my $res = $ua->request($req);
  #Check the outcome of the response
  if ($res->is_success) {
    print $res->status_line, "n";
       } else {
         print $res->status_line, "n";
      }

}

脚本运行后出现此错误(每次尝试):

500 Not a SCALAR referencen

【问题讨论】:

  • 这段杂乱无章的代码在做什么 -> Content=&gt;[$xml];
  • 没有这一行我有同样的错误:D 我只是试图用哈希表示我的数据
  • 当然,您仍然会收到错误消息 - 该行不在对 new 的调用中,因此没有做任何事情 :)
  • 另外,您应该将 $ua 创建移到循环之外,因为它对于所有请求都是恒定的。

标签: xml perl csv http-post


【解决方案1】:

您需要将字符串而不是对象传递给请求,因此您必须将$xml转换为字符串

my $req = HTTP::Request->new('POST', $uri, 
[Accept=>'application/vnd.com.cisco.ise.network.networkdevice.1.1+xml',
Content_Type=>'application/vnd.com.cisco.ise.network.networkdevice.1.1+xml; 
charset=utf-8'], $xml->sprint);

【讨论】:

  • 发出多个请求?您应该将此行 $xml -&gt; sprint; 更改为 $xml -&gt; print;,因为目前它什么都不做,但是您通过更改它,它将为每一行打印出生成的 XML。
  • $xml -&gt; sprint 一起执行多个请求,它可以工作
  • 我的意思是第 23 行之前的注释“创建用户代理对象”。代码的实际请求部分没有任何内容。除了浪费当前编写的 CPU 周期外,它什么也不做。
猜你喜欢
  • 2016-12-23
  • 2017-10-03
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多