2016-06-10 20 views
2

Ich verwende WWW::Mechanize, um eine Webseite mit einem Google Maps-Widget, das konstante Daten aus einer einzigen Antwort des Typs Text/Ereignis empfängt -Strom.Fetch Text/Ereignis-Stream-Web-Antwort mit WWW :: Mechanize oder LWP :: UserAgent

Diese Art von Antwort ist wie eine nie endende Antwort vom Server, die ständig aktualisierte Daten für das Widget zu arbeiten.

Ich versuche herauszufinden, wie man die genaue Antwort von Perl liest. Mit etwas wie:

my $mech = WWW::Mechanize->new; 

# Do some normal GET and POST requests to authenticate and set cookies for the session 

# Now try to get that text/event-stream response 

$mech->get('https://some.domain.com/event_stream_page'); 

Aber das funktioniert nicht, weil die Antwort nie endet.

Wie kann ich diese Anfrage machen und die Antwort lesen und jedes Mal, wenn der Server den Stream aktualisiert, etwas mit diesen Daten machen?

+0

Ihre Ziel-Website privat zu sein scheint. Können Sie eine öffentliche Website finden, mit der Sie das Problem reproduzieren können, damit wir es versuchen können? Ich stimme zu, dass Sie mit dem Handler den richtigen Pfad haben, aber ohne einen funktionierenden Endpunkt kann ich nicht debuggen. – simbabque

+0

@simbabque, das ist eine komplett falsche Domain. – oldtechaa

+0

@oldtechaa domain.com ist nicht falsch, es existiert. Aber das OP benutzte es (fälschlicherweise), um ihre wahre Domäne zu maskieren. Die Leute tun das normalerweise, wenn ihre Sachen in einem privaten Netzwerk sind oder sie es nicht preisgeben wollen, weil es $ Arbeit ist. Deshalb habe ich nach einem Beispiel mit dem gleichen Verhalten gefragt, das öffentlich zugänglich ist. Der richtige Weg, um eine Beispieldomäne anzugeben, die offensichtlich falsch (nicht falsch) ist, ist _http: //example.org_. – simbabque

Antwort

2

Einen Weg gefunden, dies zu tun. Mit Hilfe eines handler from LWP, von dem WWW::Mechanize inherits:

$mech->add_handler (
    'response_data', 
    sub { 
     my ($response, $ua, $h, $data) = @_; 
     # Your chunk of response is now in $data, do what you need 
     # If you plan on reading an infinite stream, it's a good idea to clean the response so it doesn't grow infinitely too! 
     $response->content(undef); 
     # Important to return a true value if you want to keep reading the response! 
     return 1; 
    }, 
); 
+0

Ein perfektes Beispiel dafür, warum man seine eigene Antwort schreiben soll - das ist nützlich für mich! – zdim

+0

@ zdim Genau! :-) –