AnyEvent::HTTP - simple but non-blocking HTTP/HTTPS client 一个简单的非堵塞的 HTTP/HTTPS 客户端:
use AnyEvent::HTTP;
http_get “http://www.nethype.de/“, sub { print $_[1] };
# … do something else here
描述:
该模块是一个AnyEvent user,你需要确保你使用和运行一个支持的event loop.
use AnyEvent::HTTP;
my $cv = AnyEvent->condvar;
http_get “https://zjcap.cn“, sub { print _[0] };cv->recv();
返回响应内容,$_[0] 函数的第一个参数是响应内容
这个模块实现了一个简单的,无状态的和非堵塞的HTTP 客户端。
它支持GET,POST和其他请求方法,cookies或者更多, 所有都在一个非常低的level.
它可以跟随重定向,支持代理服务器,并自动限制 连接数
它通常应该是一个好的客户端,对于大多数HTTP任务是足够的。
简单的任务应该是简单的, 但是复杂的任务应该仍然是有可能的,因为用户
保持控制请求和响应头。
caller 是负责认证管理,cookies(如果简单的实现在这个模块不是足够的),
引用和其他高层协议的细节
METHODS 方法:
http_get url,key=>value..., cb->( data, headers)
执行一个HTTP-GET请求,查看http_request 函数对于细节在额外的参数和返回值。
http_head url,key=>value..., cb->( data, headers)
执行一个HTTP-HEAD 请求, 查看http_request 函数得到额外的参数和返回值
http_post url, body, key => value…, cb−>( data, $headers)
执行一个HTTP-POST 请求以请求body, 查看http_request函数得到额外的参数和返回值
http_request method=> url, key => value…, cb−>( data, $headers)
执行一个HTTP 请求类型的方法,URL必须是一个绝对的http或者https URL必须是一个绝对的http或者https
当被调用在空的上下文,没有返回。在其他情况下,
http_request 返回一个 “cancellation guard”。
你必须应该保持对象至少alive 直到回调get被调用。
如果对象gets被摧毁在回调被调用前, 请求会被取消。
回调函数会被调用带上响应body 数据作为第一个参数( 或者undef如果一个错误发生),
一个hash-ref 带上一个响应header 作为第2个参数。
所有的header 在那个hash里是小写的,除了响应头,
伪头(大写来避免可能冲击可能的响应头),
状态和原因包含HTTP状态行的3个部分,如果一个错误发生在一个请求的body阶段
那么原始的状态和原因之从header是可用的作为原始状态和原始原因。
伪标头URL 包含实际的URL( 不同于请求的URL当跟随者重定向–比如,
你可能得到一个错误的 你的URL scheme 是不支持的 尽管你的URL 是一个正确的
http URL 因为它重定向到一个ftp URL, 在这种情况下,你可以看看URL伪报头
伪头重定向只存在当 请求是一个内部的重定向的结果。
在那种情况下, 它是一个array 引用 带有( data, headers) 从重定向的响应。
注意 这个响应是一个重定向本身的结果
如果server 多次发送一个header,它们的内容会被连接在一起用’,’,作为HTTP规范
如果一个内部错误发生,比如不能解析hostname, 那么$data是undef
$headers->{Status} 状态会是590-599,当前使用的状态码如下:
595 - errors during connection establishment, proxy handshake.
596 - errors during TLS negotiation, request sending and header processing.
597 - errors during body receiving or processing.
598 - user aborted request via on_header or on_body.
599 - other, usually nonretryable, errors (garbled URL etc.).
一个典型的请求看起来像这样:
sub {
my ( body, hdr) = @_;
if ($hdr->{Status} =~ /^2/) {
... everything should be ok
} else {
print "error, $hdr->{Status} $hdr->{Reason}\n";
}
}
附加的参数是键值对,并且是完全可选的,他们包括:
recurse => count(default: MAX_RECURSE)
是否是递归请求,如重定向,认证和其他重试等等,如何做
只有重定向到http和https URL是支持的,当常用的重定向格式是被处理整个在模块里,
一些请求使用额外的URI 模块。如果它是需要的但是缺少了, 那么请求会失败
headers => hashref
请求头使用, 当前的,http_request 可能提供它自己的主机,Content-Length:, Connection: and Cookie:
和Cookie: headers 会提供默认值
timeout => $seconds
超时用于各种阶段,每个连接尝试会reset timeout, 会读或者写activity,
即不是整体超时 默认是5分钟
proxy => [ host, port[, $scheme]] or undef
使用给定的http proxy 用于所有的请求, 或者没有proxy 如果undef 被使用
$scheme 必须是missing或者必须是http
如果没有指定,默认的proxy 会被使用
当前,你的proxy 需要认证,你需要指定一个相应的”Proxy-Authorization” header
在每个请求里。
body => $string
请求体, 通常是空的,会被发送( 这个模板的将来的版本可能提供更多的选项)
cookie_jar => $hash_ref
传递这个参数启用 cookie-processing, 松散的基于原netscape 规范
$hash_ref 必须是(初始是空的) hash 引用 ,会自动升级。
它是可能保存cookie jar 到持久的存储像JSON或者可储存的。
查看 AnyEvent::HTTP::cookie_jar_expire 函数如果你希望删除过期的
或者只有session的cookies
注意 这个cookie 实现不是完整的,如果你需要完整的cookie 管理器
你需要自己做。cookie_jar 意味着得到当前工作站点的很多的cookie.
cookie是一耳光灾难,不要使用它们,除非需要。
当cookie 处理被启用, Cookie: and Set-Cookie: headers 会被设置和处理通过这个模块。
否则,他们会保持不变。
tls_ctx => scheme| tls_ctx
指定 AnyEvent::TLS 上下文 被用于https连接,
这个参数遵循相同的规则作为tls_ctx 参数给 AnyEvent::Handle,
但是额外的,两个字符串低和高可以被指定.
session => $string
这个模块可以重用连接给相同的主机, 有时(例如,当使用TLS),
你不需要重用连接从其他的session .
例子:做一个简单的HTTP GET 请求对于 http://www.nethype.de/
打印响应的body.
use AnyEvent::HTTP;
my $cv = AnyEvent->condvar;
http_request GET => “http://www.nethype.de/“, sub {
my ( body, hdr) = @_;
print “body\n”;
};cv->recv();
use AnyEvent::HTTP;
my $cv = AnyEvent->condvar;
http_request
HEAD => “https://zjcap.cn“,
##代表请求头
#headers => { “user-agent” => “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0” },
headers => { “user-agent” => “MySearchClient 1.0” },
timeout => 30,
sub {
my ( body, hdr) = @_;
use Data::Dumper;
##打印响应头
print Dumper hdr;
}
;cv->recv();
10.171.246.184 - - [22/Apr/2016:13:50:20 +0800] “HEAD / HTTP/1.1” 200 0 “https://www.zjcap.cn/” “MySearchClient 1.0”