2016-06-08 44 views
0

我试图通过HTTPS GET从远程网络设备检索接口统计数据。该脚本正在工作,但是当响应大于4098个字符时,连接将挂起60秒。请帮忙 !我正在慢慢发疯。Perl - LWP :: UserAgent;响应慢 - 超过4096个字符

my $interface_getAll = HTTP::Request->new(GET => $URL); 
$interface_getAll->content('session_id=' . $sessionID . '&format=json&method=network.interface.fetchAllStatistics'); 

my $res = $ua->request($interface_getAll); 
$interface_getAll_rData = $res->content; 

my $InterfaceValues = decode_json($interface_getAll_rData); 
print Dumper($InterfaceValues); 

我无法在使用curl或wget时复制此问题,我立即得到响应。远程设备上的API仅响应GET请求。如果您认为我的代码无效,我愿意接受任何建议。

请求URL例子/格式:

https://192.168.99.51:443/services/rest/V2.1/session_id=b121c16aa0c0361e9bebe5bd67e60a&format=json&method=network.interface.fetchStatistics 
+1

您是否再次测试另一个远程实例,以确定问题出在客户端?或者您是否尝试使用curl或wget获取数据? – syck

+1

带有内容的GET不仅很奇怪,而且明显无效。您可能需要有POST或PUT请求。 –

+0

@ikegami:在这方面,较新的RFC 7231更加清晰:https://tools.ietf.org/html/rfc7231#section-4.3.1 - “GET请求消息中的有效载荷具有**没有定义的语义* *;在GET请求上发送一个负载体可能会导致一些现有的实现**拒绝这个请求。**“ –

回答

0

在远程设备上的API响应仅GET请求。

使用具有GET请求的消息正文没有定义的行为。事实上RFC 7231 clearly says

的GET请求消息内的有效载荷没有定义的语义;在GET请求上发送有效内容主体可能会导致一些现有的实现拒绝请求

因此,如果您的API确实需要带消息正文的GET,则应该考虑API损坏。

但是,考虑到你显示的URL,我宁愿建议API不需要消息体,但你只是以错误的方式使用LWP。 根据您的示例网址session_id=...不是邮件正文中,但实际上该URL的一部分,应该被加入到这一点,即

$URL = "https://192.168.99.51:443/services/rest/V2.1/session_id=...." 

虽然你可能只是直接将其追加到URL一个更清洁,可读的办法是构建具有URI您的网址池上@的建议:

use URI; 

my $url = URI->new("https://192.168.99.51:443/services/rest/V2.1/"); 
$url->query_form(
    session_id => $sessionID, 
    format  => 'json', 
    method  => 'network.interface.fetchAllStatistics', 
); 
my $interface_getAll = HTTP::Request->new(GET => $url); 
# no setting content() here 
0

你说你需要提取网址

H载荷大小://192.168.99.51:443 /服务/ REST/V2.1/SESSION_ID = b121c16aa0c0361e9bebe5bd67e60a &格式= JSON &方法= network.interface.fetchStatistics

,但你的代码是获取URL

H载荷大小://192.168.99.51:443 /服务/ REST/V2.1/

以下是您如何获取正确的网址:

use URI; 

my $url = URI->new("https://192.168.99.51:443/services/rest/V2.1/"); 
$url->query_form(
    session_id => $sessionID, 
    format  => 'json', 
    method  => 'network.interface.fetchAllStatistics', 
); 

my $response = $ua->get($url); 

使用$url->query_form可确保您的值得到正确编码。

相关问题