¿Cuál es la forma más fácil (sin abrir un shell para curl y leer de stdin) en Perl para transmitir desde otro recurso HTTP? Supongo que el recurso HTTP del que estoy leyendo es un flujo potencialmente infinito (o simplemente muy, muy largo)¿Cuál es la forma más fácil en Perl puro de transmitir desde otro recurso HTTP?
Respuesta
HTTP::Lite El método request
le permite especificar una devolución de llamada.
El parámetro
$data_callback
, si se usa, es una forma de filtrar los datos tal como se reciben o manejar grandes transferencias. Debe ser una referencia de función, y se aprobará: una referencia a la instancia de la solicitud http que realiza la devolución de llamada, una referencia al bloque actual de datos que se agregará al cuerpo y el parámetro$cbargs
(que puede ser cualquier cosa)) Debe devolver una referencia a los datos para agregarlos al cuerpo del documento o undef.
Sin embargo, mirando a la fuente, no parece a un error en Se parece más seguro de usar sub request
en que parece hacer caso omiso de la devolución de llamada pasado.set_callback
:
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Lite;
my $http = HTTP::Lite->new;
$http->set_callback(\&process_http_stream);
$http->http11_mode(1);
$http->request('http://www.example.com/');
sub process_http_stream {
my ($self, $phase, $dataref, $cbargs) = @_;
warn $phase, "\n";
return;
}
Salida:
C:\Temp> ht connect content-length done-headers content content-done data done
se ve como una devolución de llamada se pasa al método request
es tratado de forma diferente:
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Lite;
my $http = HTTP::Lite->new;
$http->http11_mode(1);
my $count = 0;
$http->request('http://www.example.com/',
\&process_http_stream,
\$count,
);
sub process_http_stream {
my ($self, $data, $times) = @_;
++$$times;
print "$$times====\n$$data\n===\n";
}
Event::Lib dará Tiene una interfaz fácil para el método IO asíncrono más rápido para usted r plataforma.
IO::Lambda es también bastante agradable para crear aplicaciones IO rápidas y receptivas.
Uh, quédate con AnyEvent. – jrockway
No sabía sobre ese módulo. ¡Se ve genial! –
El buen LWP antiguo le permite procesar el resultado como una secuencia.
Por ejemplo, aquí hay una devolución de llamada a suFunc, leyendo/pasando byte_count bytes a cada llamada a suFunc (puede descartar ese parámetro si no le importa qué tan grande es la información para cada llamada, y solo quiere procesar la transmisión lo más rápido posible):
use LWP;
...
$browser = LWP::UserAgent->new();
$response = $browser->get($url,
':content_cb' => \&yourFunc,
':read_size_hint' => byte_count,);
...
sub yourFunc {
my($data, $response) = @_;
# do your magic with $data
# $respose will be a response object created once/if get() returns
}
+1, esto pudo haber funcionado, no tuve la oportunidad de probarlo ya que la otra respuesta funcionó antes de que tuviera la oportunidad de implementar esto. – cgp
¡Hah, yo * lo sabía *! Simplemente no pude encontrarlo en los documentos, así que borré mi respuesta a medias :) – Ether
@Ether No recuerdo esto tampoco, pero tenga en cuenta que 'LWP' y' LWP :: Simple' son bestias diferentes. –
Espera, no entiendo. ¿Por qué estás descartando un proceso separado? Esto:
open my $stream, "-|", "curl $url" or die;
while(<$stream>) { ... }
me parece la "forma más fácil". Es ciertamente más fácil que las otras sugerencias aquí ...
No estoy seguro de esto pero ¿no se bloqueará hasta que Curl haya leído la respuesta completa? –
No, las salpicaduras de rizos salen como salen; no almacena nada en la memoria. Puede verificarse agarrando un archivo grande y observando el tamaño del proceso de curl mientras se carga. –
Prefiere no crear los hilos, pero de lo contrario, es una buena solución. – cgp
- 1. PySide: forma más fácil de actualizar GUI desde otro hilo
- 2. ¿Cuál es la forma más fácil de usar el comando HEAD de HTTP en PHP?
- 3. ¿Cuál es la forma más fácil de animar una línea?
- 4. C#: ¿cuál es la forma más fácil de restar tiempo?
- 5. ¿Cuál es la forma más fácil de instalar un módulo Perl perdido?
- 6. ¿Cuál es la forma más sencilla de realizar una solicitud HTTP GET en Perl?
- 7. ¿Cuál es la forma más fácil de aplicar las series de parches de Git desde Thunderbird
- 8. ¿Cuál es la forma más fácil de obtener una clave con el valor más alto de un hash en Perl?
- 9. ¿Cuál es la forma más fácil de leer un archivo DBF de FoxPro desde Python?
- 10. ¿Cuál es la forma más fácil y no intensiva de memoria de exportar XML desde Python?
- 11. ¿Cuál es la forma más fácil de dibujar texturas con OpenGL ES?
- 12. ¿Cuál es la forma más fácil de explicar qué es Hadoop y mapa/reducir?
- 13. En una aplicación MFC, ¿cuál es la forma más fácil de copiar un archivo de un directorio a otro?
- 14. ¿Cuál es la forma más fácil de hacer 'es' en Java?
- 15. ¿Cuál es la mejor forma de transmitir desde ArrayList a List en .Net 2.0
- 16. ¿Cuál es la forma más eficiente de copiar de forma masiva a SQL Server desde Java?
- 17. Cuál es la nube más fácil para contenido web estático
- 18. ¿La forma más fácil de transformar la colección en matriz?
- 19. ¿Cuál es la forma más fácil de paralelizar una tarea en Java?
- 20. cuál es la forma más fácil de poner espacio entre 2 botones uno al lado del otro en asp.net
- 21. ¿Cuál es la forma más fácil de probar la membresía de clase en coffeescript?
- 22. ¿Cuál es la forma más rápida de hacer solicitudes web concurrentes en Perl?
- 23. ¿Cuál es la forma más fácil de llenar los vacíos en una lista de números?
- 24. ¿Cuál es la forma más fácil de establecer mensajes de datos binarios personalizados en Java?
- 25. ¿Cuál es la forma más fácil de hacer la negación en los desencadenantes?
- 26. ¿Cuál es la forma más fácil de convertir la lista con str en list con int?
- 27. ¿Cuál es la forma más fácil de crear un sitio web de reserva de citas?
- 28. ¿Cuál es la forma más fácil o más efectiva de convertir la abreviatura del mes en un número en Perl? (es decir, "jan" a 1)
- 29. ¿Cuál es la forma más fácil de imprimir texto en pantalla en OpenGL?
- 30. ¿Cuál es la forma más fácil de exportar datos desde una aplicación de motor de aplicación de Google en vivo?
Impresionante, eso parece explicar por qué no importaba lo que estaba haciendo los documentos que estaba devolviendo eran 0 bytes. – cgp
Informe de error archivado: https://rt.cpan.org/Ticket/Display.html?id=50498 –
Ambos fueron buenos, pero utilicé este. – cgp