我正在使用旧的,过时的嵌入式ARM计算机进行开发,并且我没有可用于HTTP客户端支持的模块。没有LWP,没有HTTP :: Tiny等等。
我无法为此平台编译任何内容。最初的开发人员早已离开公司,该项目目前处于维护模式。
有没有办法使用纯perl获取HTTP,理想情况下是HTTPS页面?我可以复制到库树中的任何模块(没有CPAN支持......)?
谢谢。
编辑:错误的perl解决方案我认为我可以退回到运行wl或curl perl脚本 - 但内存非常有限所以我想尽可能避免这种情况。答案 0 :(得分:3)
您可以在没有库的情况下进行正常的套接字编程。 Perl支持大多数POSIX / c库来做到这一点。根据您可用的标准库的数量,您的解决方案会有所不同。如果你有像IO :: Socket :: INET这样的普通套接字,我会推荐HTTP :: Tiny,比如@ThisSuitIsBlackNot。
这是一个只使用Socket的程序,如果你需要实现自己的HTTP客户端,它应该可以帮助你。
use strict;
use warnings;
use Socket qw(PF_INET SOCK_STREAM pack_sockaddr_in inet_aton);
socket(my $socket, PF_INET, SOCK_STREAM, 0) or die "socket: $!";
my $port = getservbyname "http", "tcp";
connect($socket, pack_sockaddr_in($port, inet_aton("www.google.com"))) or die "connect: $!";
send($socket, "GET / HTTP/1.0\r\n", 0);
send($socket, "Host: www.google.com\r\n", 0);
send($socket, "User-Agent: pureperl\r\n\r\n", 0);
while (my $line = <$socket>)
{
print $line;
}
如果您还没有Socket,则需要手动完成PF_INET,SOCK_STREAM和两个功能的值。
如果您有IO :: Socket,最好使用它:
use strict;
use warnings;
use IO::Socket;
$sock = IO::Socket::INET->new(PeerAddr => 'www.google.com',
PeerPort => 'http(80)',
Proto => 'tcp');
$sock->send("GET / HTTP/1.0\r\n");
$sock->send("Host: www.google.com\r\n");
$sock->send("User-Agent: pureperl\r\n");
$sock->send("\r\n");
while (my $line = <$sock>)
{
print $line;
}
但是如果你有IO :: Socket,那么只要你复制它就可以加载来自HTTP :: Tiny的Tiny.pm。
我不建议尝试在纯perl中解决HTTPS,或者从你自己的实现开始。
答案 1 :(得分:2)
没有perl解决方案我认为我可以回退到从perl脚本运行wget或curl - 但内存非常有限所以我想尽可能避免这种情况。 < / p>
这没有任何意义,curl
使用的内存比LWP少。
加载LWP在我的机器上使用了近3,000 KiB。 curl
的图片大小仅为125 KiB。
使用curl
。