2016-06-08 28 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可確保您的值得到正確編碼。

相關問題