Perl LWP::简单&;LWP::UserAgent不';t返回完整的网页内容

Perl LWP::简单&;LWP::UserAgent不';t返回完整的网页内容,perl,lwp,lwp-useragent,Perl,Lwp,Lwp Useragent,我有一个内部本地机器,托管我需要处理的分析。如果您有URL,分析将以JSON格式返回。比如说, http://1.2.3.4:8081/analytics/mydata/myNodeData?flat 它将给出JSON文件。现在,我通过LWP::Simple(也尝试了LWP::UserAgent)将JSON文件获取到一个变量中,然后对其进行解析。它适用于我的大多数URL。问题是,对于某些URL,它不会将整个数据读入我的变量,而只是部分数据 use LWP::Simple;

我有一个内部本地机器,托管我需要处理的分析。如果您有URL,分析将以JSON格式返回。比如说,

http://1.2.3.4:8081/analytics/mydata/myNodeData?flat
它将给出JSON文件。现在,我通过LWP::Simple(也尝试了LWP::UserAgent)将JSON文件获取到一个变量中,然后对其进行解析。它适用于我的大多数URL。问题是,对于某些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;
如果有帮助的话,这里的内容(解码的_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>
编辑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;  
 } 
调试显示$response->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.

我使用这段代码或者类似的东西,这段代码使用POST来表示参数,我得到了一个大的JSON,它运行得很好

使用LWP::UserAgent;
使用数据::转储程序;
使用JSON;
使用JSON::Parse;
我的$params=
{(
“平坦”=>1,
)};
我的$server\u端点=”http://1.2.3.4:8081/analytics/mydata/myNodeData";
my$ua=LWP::UserAgent->new;
我的$req=HTTP::Request->new();
my$response=$ua->post($server\u endpoint,$params);
my$result=$response->decoded_content();
$result=from_json($result);
打印转储程序$result;

因为没有
eval
而且您的
解码json
没有失败,它不是真的正确下载了吗?它不是只是调试了被截断的输出吗?除非有比您显示的更多的内容,否则这是一个服务器错误。您使用
LWP
的代码有点笨拙,但我看不到它会导致返回的数据被截断。试试这个
my$ua=LWP::UserAgent->new
my$res=$ua->get($trendsurl)
打印$res->状态行“\n”
my$content=$res->解码内容未被调试截断。。这就是完整的输出。。至于服务器错误,我可以使用浏览器获得完整的数据。。。哪个是合法的jsonAdded eval语句Content-Length标头说明了什么?它和正文的长度相符吗?
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.