http://www.cnblogs.com/perl6/p/6911166.html

之前这里有个小小例子, 这里只要是总结一下。

HTTP::UserAgent包含了以下模块:

----------------------------------------------------------------------------------------------
Module |Path-Name |File-ID
----------------------------------------------------------------------------------------------
HTTP::Header |lib/HTTP/Header.pm6 |A2B86332480F329B842FC2F3922B81A1F7B1D4E9
HTTP::Cookie |lib/HTTP/Cookie.pm6 |8BBC36DD2291BA0AA0055B55B7DE6FD9688D6C53
HTTP::Message |lib/HTTP/Message.pm6 |36AD1387CCFFA8C668215E08B003366DCB85A964
HTTP::Cookies |lib/HTTP/Cookies.pm6 |438D31E029F25512CB05696C78EE4AF41B40527A
HTTP::Request |lib/HTTP/Request.pm6 |458DA83ACB4B7B3BA98573502EB4879AC1D92194
HTTP::Response |lib/HTTP/Response.pm6 |992068840F9CBA1830BB4A29F4338946BABA70B5
HTTP::MediaType |lib/HTTP/MediaType.pm6 |6970F2A79AC4473EED61B71050458E5BFC9702F2
HTTP::UserAgent |lib/HTTP/UserAgent.pm6 |7789AD4CBAC37F02FE832B1C68B30593E2217384
HTTP::Header::Field |lib/HTTP/Header/Field.pm6 |FDBA1F1A4186FD9C0D675459CB6D40479BA7ADE5
HTTP::Request::Common |lib/HTTP/Request/Common.pm6 |9ED2E957313B252F4FFBF086D39C8918F6C7C4F0
HTTP::UserAgent::Common|lib/HTTP/UserAgent/Common.pm6|ECD443F272FDD584E9EBA9449AA32E9C84C87F26
----------------------------------------------------------------------------------------------

 

HTTP::UserAgent -> 创建一个浏览器($ua)

HTTP::Cookies -> 设置COOKIE

HTTP::Header -> 设置头部信息, 如User-Agent, Content-Type等

HTTP::Request -> 设置一个请求, 比如POST/GET等

我们先看一下数据包结构:

上面一部分中的User-Agent/Accept等头部修息, 可以用 HTTP::Header 设置。

Cookie 位置可以用 HTTP::Cookies 设置

下面的POST发送过去的数据, 我们可以用 HTTP::UserAgent 发送或用HTTP::Request设置后再发送。

我们先看一下HTTP::Cookies

> my $c = HTTP::Cookies.new
HTTP::Cookies.new(cookies => [], file => Any, autosave => )
> $c
HTTP::Cookies.new(cookies => [], file => Any, autosave => )
>

方法有如下几个:

> $c.^methods
(extract-cookies add-cookie-header save load clear-expired clear set-cookie push-cookie Str cookies
file autosave)

手动设置Cookie可以用 set-cookie 方法:

$c.set-cookie('Set-Cookie:a=b');

注意里面的 Set-Cookie字符串一定要有。

my $cookies = HTTP::Cookies.new;
$cookies.set-cookie('Set-Cookie: name1=value1; Secure');
$cookies.set-cookie('Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT');
$cookies.clear; # 清除cookie

这就是 cookie 的设置。当然还有其他方法, 但个人觉得这个已经够用了。

我们来看 HTTP::Request:

> my $r = HTTP::Request.new;
HTTP::Request.new(method => HTTP::Request::RequestMethod, url => Any, file => Any, uri => Any, host
=> Str, port => Int, scheme => Str, header => HTTP::Header.new(fields => []), content => Any, protoc
ol => "HTTP/1.1", binary => Bool::False, text-types => Array[Str].new())
>

注意上面的 $r 对象, 它参数中包含有一个 header => HTTP::Header.new()对象, 所以我们很容易想到, 当我们创建 request 对象时, 可以设置 HTTP::Header 对象的属性值。

至于 HTTP::Header 对象的方法, 我们一会再说。 先看看 request 对象的方法:

> $r.^methods;
(new set-method uri host port scheme add-cookies add-content add-form-data form-data make-boundary S
tr parse method url file add-content remove-field content-encoding push-field protocol text-types in
flate-content decoded-content AUTOGEN parse header charset is-text Str content new clear content-typ
e media-type is-binary binary)
>

方法挺多, 这里只是说明几个常用的, 比如设置Cookie, 设置Header。

0x1设置请求类型:

my $req = HTTP::Request.new;
$req.set-method: 'POST';

你还可以设置成GET或HEAD之类的。

0x2设置请求的URL:

my $req = HTTP::Request.new;
$req.uri: 'example.com';

0x3设置Cookie:

add-cookies(HTTP::Cookies $cookies)

上面说过HTTP::Cookies的用法, 如果你设置了一个HTTP::Cookies对象, 这里直接导入就行:

my $req = HTTP::Request.new;
#my $c = HTTP::Cookies.new;
#$c.set-cookie('Set-Cookie:user=root')
$req.add-cookies($c)

0x4设置POST参数:

my %data = :what<php>;#post
my $r = HTTP::Request.new;
$r.set-method: 'POST';
$r.add-form-data(%data);#添加post

0X5设置 HTTP::Header:

上面说到, 这个HTTP::Request对象的参数里包含了一个 header => HTTP::Header.new()。而且它有个方法叫header, 我们可以先看看这个header方法是什么东西:

> my $r = HTTP::Request.new;
HTTP::Request.new(method => HTTP::Request::RequestMethod, url => Any, file => Any, uri => Any, host
=> Str, port => Int, scheme => Str, header => HTTP::Header.new(fields => []), content => Any, protoc
ol => "HTTP/1.1", binary => Bool::False, text-types => Array[Str].new())
> $r.^methods;
(new set-method uri host port scheme add-cookies add-content add-form-data form-data make-boundary S
tr parse method url file add-content remove-field content-encoding push-field protocol text-types in
flate-content decoded-content AUTOGEN parse header charset is-text Str content new clear content-typ
e media-type is-binary binary)
> my $r = HTTP::Request.new;
HTTP::Request.new(method => HTTP::Request::RequestMethod, url => Any, file => Any, uri => Any, host
=> Str, port => Int, scheme => Str, header => HTTP::Header.new(fields => []), content => Any, protoc
ol => "HTTP/1.1", binary => Bool::False, text-types => Array[Str].new())
> $r.header.WHAT
(Header)
> $r.header.^methods
(new field init-field push-field remove-field header-field-names hash clear Str parse fields)
>

可以看到, 这个 $r.header 就是一个HTTP::Header对象。(HTTP::Header对象设置HEADER信息后面有说)

怎么设置Header信息呢?很简间, 下面是一个例子:

$r.header.field(:user-Agent<this is a ie>);#设置头部信息

把你要设置的header信息当成一个字典传入到$r.header.field()当参数就行

我们还可以在创建对象时设置GET/POST与HEADER信息:

multi method new(*%args)
multi method new(Str $method, URI $uri, HTTP::Header $header);
A constructor, the first form takes parameters like:
=item method => URL, where method can be POST, GET ... etc.
=item field => values, header fields
my $req = HTTP::Request.new(:GET<example.com>, :h1<v1>);

0x6使用这个HTTP::Request对象:

如果我们把我们要设置的都设置完了, 准备发送请求, 可以这样发送:

my $u = HTTP::UserAgent.new;
my $result = $u.request($r);

现在来说说 HTTP::Header。

方法:

new field init-field push-field remove-field header-field-names hash clear Str parse fields

0x1 field设置:

use HTTP::Header;
my $h = HTTP::Header.new;
$h.field(Accept => 'text/plain');
say $h.field('Accept');
$h.remove-field('Accept');

0x2 在new 时设置:

 my $head = HTTP::Header.new(:h1<v1>, :h2<v2>);

0x3 push-header:

文档里有这个方法, 但本人没测试成功。

my $head = HTTP::Header.new;
$head.push-header( HTTP::Header::Field.new(:name<n1>, :value<v1>) );
say ~$head;

也就是说, 用push-header导入一个HTTP::Header::Field对象, 这个对象设置header时可以用如下方法:

use HTTP::Header::Field;
my $header = HTTP::Header::Field.new(:name<Date>, values => (, ));

注意这个 name, values 关键字是固定的。

0x4清除设置的header:

my $head = HTTP::Header.new(:h1<v1>, :h2<v2>);
$head.clear;

一般来说, 你知道HTTP::Header方法后, 当你创建一个HTTP::Request后, 就可以直接用  $request.header.field(:user-agent<firefox>) 这种型式设置即可。

HTTP::UserAgent

0x1 GET请求:

my $u = HTTP::UserAgent.new;
my $result = $u.get($url);

0x2 POST请求:

my $u = HTTP::UserAgent.new;
my %data = :user<root>,:password<password>;
my $result = $u.post($url, %data);

0x3设置HEADER信息:

我们可以不先创建request,再用request设置好header后,再导入request到HTTP::UserAgent中用$u.request($request)去请求。我们可以在GET/POST请求时设置好HEADER。

下面是get的方法定义

multi method get(Str $url is copy, :bin?, *%headers) returns  HTTP::Response
multi method get(URI $uri, :bin?, *%headers) returns HTTP::Response

下面是post方法定义

multi method post(URI $uri, %form, *%header ) -> HTTP::Response
multi method post(Str $uri, %form, *%header ) -> HTTP::Response

可以看到, get/post请求时, 都有一个%header字典, 那我们就可以这样设置:

> my $result =$a.get('http://localhost/1.php', :user-agent<ooooooooooooo>)
> my $result =$a.post('http://localhost/1.php', (:a<>),:user-agent<ooooooooooooo>)

注意POST请求时第二个参数是必须要有的, 这个就是POST的数据, 而第三个参数是一个收集型的hash的设置, 是设置header用的, 收集型参数可以不传送数据。

0x4设置COOKIE:

我们看一下HTTP::UserAgent的对象:

> $a
HTTP::UserAgent.new(timeout => , useragent => Any, cookies => HTTP::Cookies.new(cookies => [], fi
le => "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\mKsrWNHtC8", autosave => ), auth_login => Any, au
th_password => Any, max-redirects => , redirects-in-a-row => , throw-exceptions => Bool, debug =>
Any, debug-handle => IO::Handle, http-proxy => Any, no-proxy => [])
>

可以看到, 里面有一个 cookies => HTTP::Cookies, 我们看一下 HTTP::UserAgent的方法有哪些:

> $a.^methods
(BUILD auth get post request get-content get-chunked-content get-response get-connection is-cgi get-
proxy no-proxy use-proxy setup-auth use-auth timeout useragent cookies auth_login auth_password max-
redirects redirects-in-a-row throw-exceptions debug debug-handle http-proxy)
>

里面有一个cookies方法, 我们可以查看一下这个方法是什么:

> $a.cookies;
HTTP::Cookies.new(cookies => [], file => "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\mKsrWNHtC8", au
tosave => )
> $a.cookies.WHAT;
(Cookies)
> $a.cookies.^methods;
(extract-cookies add-cookie-header save load clear-expired clear set-cookie push-cookie Str cookies
file autosave)
>

这个原来就是前面所说的HTTP::Cookies对象。

所以设置cookies时, 我们可以这样设置:

$a.cookies.set-cookie('Set-Cookie:a=1')

0x5 request方法:

HTTP::UserAgent里有一个request方法, 这个方法就是用来导入前面所说的HTTP::Request对象用的:

my $r = HTTP::Request.new;
#do something
my $ua = HTTP::UserAgent.new;
my $result = $ua.request($r);

HTTP::Response响应对象

> my $rp = HTTP::Response.new
HTTP::Response.new(status-line => "200 OK", code => , request => HTTP::Request, header => HTTP::H
eader.new(fields => []), content => Any, protocol => "HTTP/1.1", binary => Bool::False, text-types =
> Array[Str].new())
> $rp.^methods;
(BUILD new content-length is-success has-content is-chunked set-code next-request Str status-line co
de request add-content remove-field content-encoding push-field protocol text-types inflate-content
decoded-content AUTOGEN parse header charset is-text Str content new clear content-type media-type i
s-binary binary)
>

上面是它的对象方法

0x1获取响应状态码:

> $rp.status-line;
OK
>

0x2获取返回内容:

> $result.content
<pre>array() {
}
array() {
}
ooooooooooooo
> $result.Str
HTTP/1.1 OK
Date: Fri, Jul :: GMT
Server: Apache/2.4. (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.
X-Powered-By: PHP/5.3.
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html <pre>array() {
}
array() {
}
ooooooooooooo >

可以用content或Str

有时可能也要用到decoded-content:

> $result.decoded-content
<pre>array() {
}
array() {
}
ooooooooooooo
>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 提示: get/post方法中, url不要有空格, 空格要用%20代替, 否则会报错。

如果要查看设置好后的包数据, 可以像这样:

这里的$html为response对像
> $html.request.WHAT
(Request)
> $html.request.^methods
(new set-method uri host port scheme add-cookies add-content add-form-data form-data make-boundary S
tr parse method url file add-content remove-field content-encoding push-field protocol text-types in
flate-content decoded-content AUTOGEN parse header charset is-text Str content new clear content-typ
e media-type is-binary binary)
> $html.request.host
localhost
> $html.request.Str
POST /.php HTTP/1.1
Host: localhost
Content-Length:
Content-Type: application/x-www-form-urlencoded
Connection: close =&=&= >
当然 , 如果$r为request对像, 也可以像下面这样查。
> $r.Str
POST /1.php HTTP/1.1
Host: localhost
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
Connection: close 5=6&1=2&3=4

参考链接:

https://github.com/sergot/http-useragent

perl6 HTTP::UserAgent (2)的更多相关文章

  1. perl6 HTTP::UserAgent发送post

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; say 'All method:'; say $ua.^methods; my %data = : ...

  2. perl6 HTTP::UserAgent (3) JSON

    如果一个 URL 要求POST数据是 JSON格式的, 那我们要怎么发送数据呢? 第一种: HTTP::Request 上一篇说到, 发送 POST 数据, 可以: . $ua.post(url, % ...

  3. HTTP::UserAgent注意问题

    例用 HTTP::Request 设置头信息时, 比如 add-content , 第二次再执行 add-content 时, content 内容会追加, 并不会重新添加. 当下次再 add-con ...

  4. Perl6 必应抓取(2):最终版

    use HTTP::UserAgent; use URI::Encode; Firefox/52.0>); my $bing_url = 'http://cn.bing.com/search?q ...

  5. perl6检测网站CMS脚本(测试代码)

    代码如下: use HTTP::UserAgent; use JSON::Tiny; my $check-url = 'www.baidu.com'; #say @*ARGS[0]; #检测命令行参数 ...

  6. perl6 struct2-045 EXP

    测试站点: http://www.yutian.com.cn/index.action http://www.hjxzyzz.com:8088/pfw/login.action 代码如下: use v ...

  7. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  8. 如何直接在 PC 端获取其它端设备的 UserAgent 信息呢?

    如何直接在 PC 端获取其它端设备的 UserAgent 信息呢 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收 ...

  9. 五、基于hadoop的nginx访问日志分析--userAgent和spider

    useragent: 代码(不包含蜘蛛): # cat top_10_useragent.py #!/usr/bin/env python # coding=utf-8 from mrjob.job ...

随机推荐

  1. 从零开始学Kotlin-基础语法(1)

    从零开始学Kotlin基础篇系列文章 注释 //单行注释 /* 多行注释 */ /** * 多行注释 */ 定义变量/常量 变量定义:var 关键字 var <标识符> : <类型& ...

  2. 关于使用实验室服务器的GPU以及跑上TensorFlow代码

    连接服务器 Windows - XShell XFtp SSH 通过SSH来连接实验室的服务器 使用SSH连接已经不陌生了 github和OS课设都经常使用 目前使用 192.168.7.169 使用 ...

  3. HDU 2028 Lowest Common Multiple Plus

    http://acm.hdu.edu.cn/showproblem.php?pid=2028 Problem Description 求n个数的最小公倍数.   Input 输入包含多个测试实例,每个 ...

  4. TCP/IP之大明内阁 转

    原创: 刘欣 码农翻身 2016-11-02 本文是<TCP/IP之大明王朝邮差>的前传,  讲一讲大明内阁的各位大人是怎么设计TCP/IP网络的.大明天启年间,  明熹宗朱由校醉心于木工 ...

  5. Eclipse RCP学习资料

    1.拥抱Eclipse RCP http://www.blogjava.net/youxia/category/17374.html 2.RCP工程下面自动生成了如下文件:Application.ja ...

  6. pgm4

    这部分 cover 两个比较特殊的情形,一个是 Gaussian networks,一个是 exponential family. 正态分布常见的参数化策略是均值 和协方差矩阵 ,另一种是使用 inf ...

  7. 【刷题】LOJ 2587 「APIO2018」铁人两项

    题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段 ...

  8. BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流

    显然是个最小割嘛! 一开始我是这么建图的: 源点向狼连INF 羊向汇点连INF 每两个相邻格子间连双向边,边权为1 然后T成狗 后来我是这么建图的: 源点向狼连INF 羊向汇点连INF 狼和空地向相邻 ...

  9. Maven添加第三方库及部署配置

    配置其实很简单,还是修改~/.m2/settings.xml文件,具体用文件说话,其他不解释. <?xml version="1.0" encoding="UTF- ...

  10. 前端学习 -- Css -- 浮动

    块元素在文档流中默认垂直排列,所以这个三个div自上至下依次排开,如果希望块元素在页面中水平排列,可以使块元素脱离文档流. 使用float来使元素浮动,从而脱离文档流 可选值: none,默认值,元素 ...