私は内部のローカルマシンを持っています。 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.
一切 'eval'ありませんので、あなた' decode_json 'は失敗しませんでした。実際に正しくダウンロードされたのではなく、切り捨てられた出力をデバッグするだけではありませんか? –
あなたが示した以上のことがない限り、これはサーバーのバグです。 'LWP'を使用しているあなたのコードはちょっと大変ですが、返されたデータを切り捨てることはできません。代わりに 'my $ ua = LWP :: UserAgent-> new;' '$ res = $ ua-> get($ trendurl);' 'print $ res-> status_line" "\ n"; '' my $ ' content = $ res-> decoded_content; ' – Borodin
これはデバッグによって切り捨てられず、完全な出力です。サーバーのバグに関する限り、私はブラウザを使って完全なデータを取得することができます。これは正当なものですjson – Muzammil