2016-05-10 33 views
1

私は内部のローカルマシンを持っています。 URLがある場合、解析はJSON形式で返されます。たとえば、LWP :: Simple&LWP :: UserAgentが完全なWebページのコンテンツを返さない

http://1.2.3.4:8081/analytics/mydata/myNodeData?flat 

JSONファイルを指定します。今私は、LWP :: Simpleを介してJSONファイルを取得しています(LWP :: UserAgentも試してみました)。それは私の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; 

ここで役立つのは、コンテンツのデバッグ情報(decoded_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> 

..私は私のブラウザ、その完全な...

EDITを経由してこれを取得した場合:

URLをフェッチしている間に、私は次のようにeval文を追加して、 JSONの復号化はエラーなしですが、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. 

EDIT 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. 
+1

一切 'eval'ありませんので、あなた' decode_json 'は失敗しませんでした。実際に正しくダウンロードされたのではなく、切り捨てられた出力をデバッグするだけではありませんか? –

+0

あなたが示した以上のことがない限り、これはサーバーのバグです。 'LWP'を使用しているあなたのコードはちょっと大変ですが、返されたデータを切り捨てることはできません。代わりに 'my $ ua = LWP :: UserAgent-> new;' '$ res = $ ua-> get($ trendurl);' 'print $ res-> status_line" "\ n"; '' my $ ' content = $ res-> decoded_content; ' – Borodin

+0

これはデバッグによって切り捨てられず、完全な出力です。サーバーのバグに関する限り、私はブラウザを使って完全なデータを取得することができます。これは正当なものですjson – Muzammil

答えて

-2

私は、私はこれで大規模なJSONを取得し、このコードまたはそのような何か、のparamsのために、このコード使用POSTを使用してその作品だけでなく

use LWP::UserAgent; 
use Data::Dumper; 
use JSON; 
use JSON::Parse; 

my $params = 
{(
'flat' => 1, 
)}; 

    my $server_endpoint = "http://1.2.3.4:8081/analytics/mydata/myNodeData"; 
    my $ua = LWP::UserAgent->new; 
    my $req = HTTP::Request->new(); 
    my $response = $ua->post($server_endpoint, $params); 
    my $result = $response->decoded_content(); 

    $result = from_json($result); 
    print Dumper $result; 
関連する問題