perl6 HTTP::UserAgent (2)
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 => 0) > $c HTTP::Cookies.new(cookies => [], file => Any, autosave => 0) >?
方法有如下幾個:
> $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:
文檔里有這個方法, 但本人沒測試成功。
也就是說, 用push-header導入一個HTTP::Header::Field對象, 這個對象設置header時可以用如下方法:
use HTTP::Header::Field; my $header = HTTP::Header::Field.new(:name<Date>, values => (123, 456));注意這個 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<1>),:user-agent<ooooooooooooo>)注意POST請求時第二個參數是必須要有的, 這個就是POST的數據, 而第三個參數是一個收集型的hash的設置, 是設置header用的, 收集型參數可以不傳送數據。
?
0x4設置COOKIE:
我們看一下HTTP::UserAgent的對象:
> $a HTTP::UserAgent.new(timeout => 180, useragent => Any, cookies => HTTP::Cookies.new(cookies => [], fi le => "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\mKsrWNHtC8", autosave => 1), auth_login => Any, au th_password => Any, max-redirects => 5, redirects-in-a-row => 0, 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 => 1) > $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 => 200, 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; 200 OK >?
0x2獲取返回內容:
> $result.content <pre>array(0) { } array(0) { } ooooooooooooo > $result.Str HTTP/1.1 200 OK Date: Fri, 07 Jul 2017 15:51:43 GMT Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9 X-Powered-By: PHP/5.3.29 Connection: close Transfer-Encoding: chunked Content-Type: text/html<pre>array(0) { } array(0) { } ooooooooooooo>可以用content或Str
有時可能也要用到decoded-content:
> $result.decoded-content <pre>array(0) { } array(0) { } 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 /1.php HTTP/1.1 Host: localhost Content-Length: 11 Content-Type: application/x-www-form-urlencoded Connection: close5=6&1=2&3=4>
當然 , 如果$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
?
轉載于:https://www.cnblogs.com/perl6/p/7134600.html
總結
以上是生活随笔為你收集整理的perl6 HTTP::UserAgent (2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在sql server数据库的一个表中如
- 下一篇: 5.Lock接口及其实现Reentran