1
我有一個內部本地機器,託管分析,我需要處理。如果您擁有該網址,則會以JSON格式返回分析結果。例如,LWP :: Simple&LWP :: UserAgent不返回完整的網頁內容
http://1.2.3.4:8081/analytics/mydata/myNodeData?flat
它會給JSON文件。現在我通過LWP :: Simple(也試過LWP :: UserAgent)將JSON文件放入一個變量中,然後解析它。它適用於我的大部分網址。問題在於,對於一些URL,它不會將整個數據讀入我的變量,但只是部分。
use LWP::Simple; # From CPAN
use LWP::UserAgent;
use JSON qw(decode_json); # From CPAN
use Data::Dumper; # Perl core module
use Data::Diver qw{ Dive }; # for diving in the Hash
use strict; # Good practice
use warnings; # Good practice
#using LWP Simple
my $trendsurl = 'http://1.2.3.4:8081/analytics/mydata/myNodeData?flat';
my $json = get($trendsurl);
die "Could not get $trendsurl!" unless defined $json;
my $decoded_json = decode_json($json);
#using LWP::UserAgent
my $ua = LWP::UserAgent->new();
my $req = new HTTP::Request GET => $trendsurl;
my $res = $ua->request($req);
my $content = $res->content;
如果這裏有用的是顯示調試信息的內容(decode_json)是一樣的。
DB<1> p $content
{"NodeStatus": {"deleted": false, "disk_usage_info": [{"partition_space_availabl
e_1k": 791475728, "partition_space_used_1k": 171611096, "partition_name": "/dev/
mapper/os-root", "partition_type": "ext4"}, {"partition_space_available_1k": 151
200, "partition_space_used_1k": 39244, "partition_name": "/dev/vda3", "partition
_type": "ext2"}], "process_info": [{"process_name": "XX-api:0", "process_s
tate": "PROCESS_STATE_RUNNING", "last_stop_time": null, "start_count": 2, "core_
file_list": [], "last_start_time": "1461822985334246", "stop_count": 0, "last_ex
it_time": null, "exit_count": 0}, {"process_name": "XX-config-nodemgr", "p
rocess_state": "PROCESS_STATE_RUNNING", "last_stop_time": null, "start_count": 2
, "core_file_list": [], "last_start_time": "1461822979324868", "stop_count": 0,
"last_exit_time": null, "exit_count": 0}, {"process_name": "XX-discovery:0
", "process_state": "PROCESS_STATE_RUNNING", "last_stop_time": null, "start_coun
t": 2, "core_file_list": [], "last_start_time": "1461822983332516", "stop_count"
: 0, "last_exit_time": null, "exit_count": 0}, {"process_name": "XX-svc-m
DB<2>
你看到日誌文件被突然終止。如果我通過我的瀏覽器,它完全得到這個..
編輯:
添加以下eval語句而獲取URL,然後解碼JSON .. retreival沒有錯誤,但JSON解碼失敗,因爲它不是一個完整的JSON。
eval { $decoded_json = parse_json($json) };
if ([email protected]) {
warn "func raised an exception: [email protected]";
}
func raised an exception: JSON error at line 1: Unexpected end of input parsing
string starting from byte 1105 at Tester.pl line 28.
編輯2: 我只是嘗試另一種方式......
#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;
my $URL = 'http://1.2.3.4:8081/analytics/mydata/myNodeData?flat';
my $ua = LWP::UserAgent->new();
my $header = HTTP::Request->new(GET => $URL);
my $request = HTTP::Request->new('GET', $URL, $header);
my $response = $ua->request($request);
if ($response->is_success){
print "URL:$URL\nHeaders:\n";
print $response->headers_as_string;
}elsif ($response->is_error){
print "Error:$URL\n";
print $response->error_as_HTML;
}
和調試表明,$響應 - > is_success塊被選中,這裏是輸出。
URL:http://1.2.3.4:8081/analytics/mydata/myNodeData?flat
Headers:
Connection: close
Date: Tue, 10 May 2016 19:49:40 GMT
Content-Type: application/json
Client-Aborted: die
Client-Date: Tue, 10 May 2016 19:49:38 GMT
Client-Peer: 1.2.3.4:8081
Client-Response-Num: 1
Client-Transfer-Encoding: chunked
X-Died: read failed: An existing connection was forcibly closed by the remote ho
st. at C:/Perl64/lib/LWP/Protocol/http.pm line 465.
既然沒有'eval'和你'decode_json '沒有失敗,是不是真的下載正確,是不是隻是調試輸出被截斷? –
除非你有更多這方面的信息,否則這是一個服務器錯誤。你的代碼使用'LWP'有點笨重,但我看不到它導致返回的數據被截斷。試試這個,而不是'my $ ua = LWP :: UserAgent-> new;''my $ res = $ ua-> get($ trendsurl);''print $ res-> status_line,「\ n」;''my $內容= $ res-> decoded_content;' – Borodin
其調試不被截斷..這是完整的輸出..而就服務器錯誤而言,我能夠使用瀏覽器獲得完整的數據......這是一個合法的json – Muzammil