/ / JSON in Perl holen - json, perl, http, get, mojolicious

Holen JSON in Perl - JSON, Perl, http, erhalten, mojolicious

Ich habe in Perl an der Entwicklung eines Emulators gearbeitet, und eines der Probleme, mit denen ich konfrontiert werde, ist die Analyse von JSON-Dateien, die sich auf dem Computer befinden. Wenn ich versuche, sie von meinem Server zu holen, funktionieren sie gut ...

    method getContent(@arrURLS) {
my %arrInfo;
my $resUserAgent = Mojo::UserAgent->new;
foreach my $strURL (@arrURLS) {
$resUserAgent->get($strURL => sub {
my($resUserAgent, $tx) = @_;
if ($tx->success) {
my $strName = basename($strURL, ".json");
my $arrData = $tx->res->body;
$arrInfo{$strName} = $arrData;
}
Mojo::IOLoop->stop;
});
Mojo::IOLoop->start;
}
return %arrInfo;
}

Angenommen @arrURLS ist:

my @arrURLS = ("file:///C:/Users/Test/Desktop/JSONS/first.json", "file:///C:/Users/Test/Desktop/JSONS/second.json");

Die oben genannten URLs sind diejenigen, die nicht funktionieren, aber wenn ich das ändere zu:

my @arrURLS = ("http://127.0.0.1/test/json/first.json", "http://127.0.0.1/test/json/second.json");

Es klappt.

Auch ich würde gerne etwas Besseres verwenden als Mojo::UserAgent weil es ein bisschen langsam scheint, als ich es benutzt habe Coro mit LWP::Simple es war viel schneller aber leider Coro ist in Perl 5.22 gebrochen ...

Antworten:

4 für die Antwort № 1

User Agents dienen hauptsächlich zum Herunterladen von Dateien über http. Es wird normalerweise nicht erwartet, dass sie Dateisystem-URIs behandeln. Du brauchst open und lies die Datei selbst oder ein Modul wie Datei :: Schlürfen Das macht es für dich.

Es könnte in etwa so aussehen.

use File::Slurp "read_file";

method getContent(@arrURLS) {
my %arrInfo;
my $resUserAgent = Mojo::UserAgent->new;
foreach my $strURL (@arrURLS) {
if (substr($strURL, 0, 4) eq "file") {
$arrInfo{basename($strURL, ".json")} = read_file($strURL);
} else {
$resUserAgent->get($strURL => sub {
my($resUserAgent, $tx) = @_;
if ($tx->success) {
my $strName = basename($strURL, ".json");
my $arrData = $tx->res->body;
$arrInfo{$strName} = $arrData;
}
Mojo::IOLoop->stop;
});
Mojo::IOLoop->start;
}
}
return %arrInfo;
}

2 für die Antwort № 2

Ich benutze es WWW :: Mechanisieren für alle diese Aufgaben. Aus dem Dokument:

WWW :: Mechanize ist eine korrekte Unterklasse von LWP :: UserAgent und Sie können auch Verwenden Sie eine der Methoden von LWP :: UserAgent.

was bedeutet, dass Sie es füttern können file:// Geben Sie auch URLs ein.

Zum Beispiel, die folgenden One-Liner-Dumps Ihre passwd Datei.

perl -MWWW::Mechanize -E "say WWW::Mechanize->new->get("file://etc/passwd")->content"

oder ein Beispiel ohne Fehlerbehandlung ...

use 5.014;
use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get("file://some/path");
say $mech->content;

Wie auch immer, wahrscheinlich ist es besser, für lokale Dateien einige zu verwenden file-based Dienstprogramm, ich benutze für alle Datei-Dinge die Pfad :: Winzig Modul, das (nicht nur beschränkt) eine Methode zum File Slurping hat, wie:

use Path::Tiny;
my $content = path("/some/path")->slurp;

oder einfach nur perl:

open my $fh, "<", "/some/file" or die "...";
my $content = do { local $/; <$fh> };
close $fh;

1 für die Antwort № 3

Es ist wichtig immer zu sagen, welche zusätzlichen Module du verwendest. Ich denke, dein Code verwendet Method::Signatures, und ich habe den untenstehenden Code nur getestet, um zu überprüfen, ob er mit dem Modul an Ort und Stelle kompiliert wird

Mojolicious ist ein hervorragendes Tool für seinen Zweck, aber es konzentriert sich auf HTTP-URLs. LWP::UserAgent ist viel allgemeiner und das Dokumentation für LWP sagt das

Stellt ein objektorientiertes Modell der HTTP-artigen Kommunikation bereit. In diesem Rahmen unterstützen wir derzeit den Zugriff auf die Ressourcen http, https, gopher, ftp, news, file und mailto

Ihre Methode wird so etwas. Es ist nicht getestet

method get_content(@urls) {

my %info;

my $ua = LWP::UserAgent->new;

for my $url (@urls) {

my $res = $ua->get($url);
die $res->status_line unless $res->is_success;

my $name     = basename($url) . ".json";
my $data     = $res->decoded_content;
$info{$name} = $data;
}

%info;
}



Ich möchte Sie auch ermutigen, die ungarische Notation im Zusammenhang mit Perl-Code zu verwerfen, da die Sprache bereits ihre Sigillen hat, die den Datentyp bezeichnen

@arrURLS dupliziert die Information, dass dies arrURLS ist ein Array, während %arrInfo ist einfach falsch als das arrInfo ist ein Hash. $arrData ist eigentlich ein Skalar, obwohl vielleicht ein Indikator, dass es auch ein Referenz kann helfen, und $arrURLS[0] ist auch ein Skalar (daher der Dollar)

Es gibt auch nichts zu stoppen Sie mit $arrURLS (Das ist eine völlig separate Variable von @arrURLS)