免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1548 | 回复: 0
打印 上一主题 下一主题

Perl使用技巧19:使用get和post请求数据 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-12-18 06:20:00每日论坛发贴之星
日期:2015-12-18 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-15 14:19 |只看该作者 |倒序浏览
Perl使用技巧19:使用get和post请求数据

最常用的3个模块:
use HTTP::Request::Common;                                #GET POST
use LWP::Simple;                                                #get getstore mirror
use LWP::UserAgent;

常用的2个Useragent:
$iphone = "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53";
$chrome= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36";

-----------
大体来说:
LWP::UserAgent是用来组装浏览器信息的。
     LWP::Simple是一个简化的模块

HTTP::Request 是用来组装请求信息的。
     HTTP::Request::Common是一个简化的模块

HTTP::Headers是用来组装头部信息的。
     如果用简化模块的话,这个模块可以不用。

-----------
一般GET的时候最简单,不需要改变头部信息,最简单的方法是这样:

$url="baidu.com";
$get=get($url);
say $get;
注意请替换为http的网址,我发不了连接。

get是LWP::Simple中的方法,一次获得内容。

-----------
$res=$ua->get($url);
$get=$res->content;
say $get;

这样也可以,这个get是ua的方法。

-----------
获取网络请求到文件,这个是LWP::Simple中的方法:

$file="/tmp/get.txt";
getstore($url,$file);

-----------
LWP::UserAgent中关于post的方法是这样的:

$ua->post( $url, \%form )
$ua->post( $url, \@form )
$ua->post( $url, \%form, $field_name => $value, ... )
$ua->post( $url, $field_name => $value,... Content => \%form )
$ua->post( $url, $field_name => $value,... Content => \@form )
$ua->post( $url, $field_name => $value,... Content => $content )

简单的时候还算好用,如果想仔细检查头部信息的话,就不如分步来提交了,方便调试。

-----------

sub mypost {
        my ($url,$content,$header)=@_;
        my $ua=new LWP::UserAgent;
       
        my $req;
        if ($content) {
                if ($header) {
                        $req=POST($url,%$header,Content=>$content);
                }else{
                        $req=POST($url,$content);
                }
        }else{
                $req=GET($url);
        }
        # say Dumper($req)
        my $res=$ua->request($req);
        my $get=$res->content;
        $get=decode_utf8($get);
        return $get;
}

header可以提前准备好:

my %header=(
        'Content_Type' => 'multipart/form-data'
);

content也可以提前准备好:
my %content=(
        "api_key"=>$FACE_key,
        "api_secret"=>$FACE_secret,
        "attribute"=>"none"
);

请求的时候,只送上URL就可以get。
送上URL和content就可以post。
如果还需要改header,就再送上头部信息。

my $get=mypost($FACE_base,\%content,\%header);

----------------
say Dumper($req);

类似这个样子:

$VAR1 = bless( {
                 '_content' => '',
                 '_uri' => bless( do{\(my $o = 'baidu.com')}, 'URI::http' ),
                 '_headers' => bless( {}, 'HTTP::Headers' ),
                 '_method' => 'GET'
               }, 'HTTP::Request' );

对于需要设置头部的网络请求,最好是Dumper出来看看对不对,否则设置错误是不会请求成功的。

---------------
如果需要设置浏览器信息头,类似这个样子:

sub myget {
        my ($url,$proxy,$mobile)=@_;
        my $ua=new LWP::UserAgent;

        #不需代理可以注释
        if ($proxy) {$ua->proxy(['http','https'],$proxy);}

        #不需手机访问可以注释
        if ($mobile) {
                $ua->agent($iphone);
        }else{
                $ua->agent($chrome);
        }

        #不需cookie可以注释
        $ua->cookie_jar(HTTP::Cookies->new(file =>$file_cookie,autosave => 1, ignore_discard => 1));

        #不需SSL可以注释
        $ua->ssl_opts(verify_hostname=>0);
        $ua->timeout(4);


        my $req=GET($url);
        my $res=$ua->request($req);
        my $get=$res->content;
        return $get;
}

----------------
如果post的时候要上传一个文件,类似这样:

$content{"img"}=[undef,"img.jpg",Header=>"application/octet-stream",Content=>$img];

其实这篇文章讲的不好,需要多多测试,才能弄清楚网络请求这一大堆概念。如果熟练的话,可以编写出自己的myget & mypost,以后就方便多了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP