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:

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

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 => (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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java会话技术

会话技术&#xff1a; 会话指的是客户端浏览器和服务端之间的度偶次请求和响应当打开浏览器&#xff0c;访问网站地址后&#xff0c;会话开始&#xff0c;当关闭浏览器&#xff08;或者到了过期时间&#xff09;&#xff0c;会话结束。就像打电话只要不挂电话就是一次会话。 会…

【调用IP宏文件进行仿真】modelsim仿真时出现 Instantiation of 'xxx' failed. The design unit was not found....

出现错误类似&#xff1a;modelsim 仿真fifo时出现 Error: (vsim-3033) E:/Programs/ModelSim/fifo/ps2_fifo.v(75): Instantiation of scfifo failed. The design unit was not found.仿真波形不对&#xff0c;调用的ip核没有输出&#xff08;白色虚线&#xff09;等情况&…

Java Server Page

JSP JSP全称是Java Server Page&#xff0c;基于Java和Servlet一样是sun公司推出的一套开发动态web资源的技术&#xff0c;称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。jsp是一种动态网页技术标准&#xff0c;jsp部署在服务器上可以处理客户端的请求&#xff0c;并根据…

HDFS概述(2)————Block块大小设置

参考&#xff1a;HDFS概述&#xff08;4&#xff09;————HDFS权限HDFS概述&#xff08;3&#xff09;————HDFS FederationHDFS概述&#xff08;2&#xff09;————Block块大小设置HDFS概述&#xff08;1&#xff09;————HDFS架构问题Q: 一个常被问到的一个问题是…

PTA 01-复杂度2 Maximum Subsequence Sum (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum (25分) Given a sequence of KK integers { N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ }. A continuous subsequence is defined to be { N_iN​i​​, N_{i1}N​i1​​, ..…

Listener

观察者设计模式&#xff1a; 它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时&#xff0c;触发事件。 观察者模式通常由以下三部分组成&#xff1a; ​1. 事件源&#xff1a;触发事件的对象。 2.​ 事件&#xff1a;触发的动作&#xff0c;…

BZOJ 1083: [SCOI2005]繁忙的都市【Kruscal最小生成树裸题】

1083: [SCOI2005]繁忙的都市 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2925 Solved: 1927[Submit][Status][Discuss]Description 城市C是一个非常繁忙的大都市&#xff0c;城市中的道路十分的拥挤&#xff0c;于是市长决定对其中的道路进行改造。城市C的道 路是这样分…

Mysql介绍与安装LinuxmacOS系统

数据库&#xff1a; 用于存储和管理数据的仓库 数据库的好处&#xff1a; 可以持久化存储数据方便存储和管理数据使用了统一的方式操作数据库 – SQL 常见的数据库&#xff1a; Oracle&#xff1a;收费的大型数据库&#xff0c;Oracle公司的产品。Oracle收购SUN公司&#xff0c…

如何查看Laravel版本号的三种方法

1.PHP artisan --version 2.vim vendor/laravel/framework/src/Illuminate/Foundation/Application.php 3&#xff1a;可以写在路由里 5.4版本的路由文件夹是routes。我们可以写在routes\web.php里。 Route::get(laravel-version, function(){ $laravel app(); return…

最全的Mysql数据类型

数值类型&#xff1a; 类型大小范围&#xff08;有符号&#xff09;范围&#xff08;无符号&#xff09;用途Bit1bytes-128 ~ 120 ~ 255小整数值TINYINT1 byte-128 ~ 1270 ~ 255小整数值SMALLINT2 bytes-32768 ~ 327670 ~ 65535大整数值MEDIUMINT3 bytes-8388608 ~ 83886070 ~…

02_反汇编_反编译

实际上安卓的应用都是zip包,只不过把zip扩展名修改了,修改成了APK.所以如果你想拿到它的图片的话,实际上特别简单&#xff0c;你就把它这个.apk换成.zip.换成.zip之后这里的图片资源就都可以拿到了. 有些公司可能美工的水平或者美工的人数比较少&#xff0c;项目还比较急&#…

SQL约束语法

约束 作用&#xff1a;对表中的数据进行限定&#xff0c;保证数据的正确性、有效性、完整性&#xff01; 约束分类&#xff1a; 约束说明PRIMARY KEY主键约束PRIMARY KEY AUTO_INCREMENT主键、自动增长UNIQUE唯一约束NOT NULL非空约束FOREIGN KEY外键约束FOREIGN KEY ON UPDAT…

hdu 2489 Minimal Ratio Tree

https://vjudge.net/problem/HDU-2489 题意&#xff1a;求一个完全图的最优比率生成树&#xff0c;点的个数由题给出。最优比率生成树是边的权值之和与点的权值之和的比值最小的生成树。 思路&#xff1a;一开始用dfs枚举搜索每一种情况&#xff0c;t了&#xff0c;枚举的情况太…

SQL多表关联

多表关联&#xff1a; 多张数据表之间是可以有一定的关联关系&#xff0c;这种关联关系可以通过外键约束实现 多表的分类&#xff1a; 一对一一对多多对多 一对一&#xff1a; 一张表对应一张表 适用场景举例&#xff1a; 人和身份证。一个人只能有一个身份证&#xff0c;一个身…

背包问题 codevs2210 数字组合

数字组合 题目描述 Description在N个数中找出其和为M的若干个数。先读入正整数N和M&#xff0c; 再读入N个正数&#xff08;可以有相同的数字&#xff0c;每个数字均在1000以内&#xff09;&#xff0c; 在这N个数中找出若干个数&#xff0c; 使它们的和是M&#xff0c; 把满足…

SQL多表查询

多表查询分类&#xff1a; 内连接查询 显式内连接隐式内连接 外连接查询 左外连接右外连接 子查询自关联查询 准备数据&#xff1a; -- 创建user表 CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT, -- 用户idNAME VARCHAR(20), -- 用户姓名age INT …

HTTP协议整理

一、概念 1.HTTP协议&#xff1a;即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和Web服务器之间互相通信的规则&#xff0c;它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。它可以使浏览器更加高效&#xff0c;使网络传输减少。…

【DDD】--好文收藏

索引&#xff1a; 目录索引 发现一批好文&#xff0c;完整系列&#xff0c;攒~~ 随笔分类 - DDD - 『圣杰』 DDD理论学习系列&#xff08;1&#xff09;-- 通用语言 笔记&#xff1a; 通用语言&#xff1a; a) 简单&#xff0c;便于理解、传播。 b) 需要通用&#xff0c;能够准…

SQL存储过程、存储函数

概念&#xff1a; 存储过程和函数&#xff1a; 存储过程和函数是事先经过编译并存储在数据库中的一SQL语句的集合 存储过程和函数的好处&#xff1a; 存储过程和函数可以重复使用&#xff0c;减轻开发人员的工作量。类似于java中方法可以多次调用减少网络流量&#xff0c;存储…

meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1 /

X-UA-Compatible是针对IE8新加的一个设置&#xff0c;对于IE8之外的浏览器是不识别的&#xff0c;这个区别与content"IE7"在无论页面是否包含<!DOCTYPE>指令&#xff0c;都像是使用了 Windows Internet Explorer 7的标准模式。而content"IEEmulateIE7&quo…