Perl工具链峰会需要更多赞助商。如果您的公司取决于Perl,拜托支持这一非常重要的活动.

名称

LWP-Perl的World-Wide Web库

简介

使用LWP;print“这是libwww-perl-$LWP::VERSION\n”;

描述

libwww-perl集合是一组perl模块,它为World-WideWeb提供了一个简单而一致的应用程序编程接口(API)。该库的主要重点是提供允许您编写WWW客户端的类和函数。该库还包含更通用的模块,甚至包含帮助您实现简单HTTP服务器的类。

此库中的大多数模块都提供了面向对象的API。用户代理、从WWW服务器发送的请求和接收的响应都由对象表示。这为这些服务提供了一个简单而强大的接口。该界面易于扩展和定制,以满足您的需要。

该图书馆的主要特点是:

  • 包含各种可单独或一起使用的可重用组件(模块)。

  • 提供HTTP式通信的面向对象模型。在这个框架内,我们目前支持访问http协议,https(https),地鼠,ftp协议,新闻,文件、和电子邮件资源。

  • 提供完整的面向对象接口或非常简单的过程接口。

  • 支持基本授权方案和摘要授权方案。

  • 支持透明重定向处理。

  • 支持通过代理服务器进行访问。

  • 为提供分析器robots.txt(机器人.txt)文件和构建机器人的框架。

  • 支持HTML表单的解析。

  • 实现可在协议模块和服务器脚本(如CGI脚本)中使用的HTTP内容协商算法。

  • 支持HTTP cookie。

  • 例如,一些简单的命令行客户端lwp-请求lwp下载.

HTTP风格的通信

libwww-perl库基于HTTP风格的通信。本节试图描述这意味着什么。

让我们从HTTP规范文档中的这句话开始http://www.w3.org/协议/:

  • HTTP协议基于请求/响应范式。客户端与服务器建立连接,并以请求方法、URI和协议版本的形式向服务器发送请求,然后是一条类似MIME的消息,其中包含请求修饰符、客户端信息和可能的正文内容。服务器以状态行进行响应,包括消息的协议版本和成功或错误代码,然后是类似MIME的消息,其中包含服务器信息、实体元信息和可能的正文内容。

这对libwww-perl意味着通信总是通过以下步骤进行:首先请求对象已创建并配置。然后这个对象被传递到服务器,我们得到一个响应我们可以检查的对象。请求始终独立于任何以前的请求,即服务是无状态的。相同的简单模型用于我们想要访问的任何类型的服务。

例如,如果我们想从远程文件服务器获取文档,那么我们向它发送一个包含该文档名称的请求,而响应将包含文档本身。如果我们访问搜索引擎,那么请求的内容将包含查询参数,响应将包含查询结果。如果我们想向某人发送邮件消息,那么我们将向邮件服务器发送一个包含我们的消息的请求对象,而响应对象将包含一个确认,告知我们消息已被接受,并将转发给收件人。

就这么简单!

请求对象

libwww-perl请求对象具有类名HTTP::请求。类名使用HTTP::作为前缀只意味着我们使用HTTP通信模型。它不限制我们可以尝试通过的服务种类请求到。例如,我们将发送HTTP::请求发送到ftp和gopher服务器,以及本地文件系统。

请求对象的主要属性包括:

  • 方法是一个短字符串,用于说明这是哪种请求。最常见的方法是GET(获取),PUT(输出),邮政头部.

  • uri(用户界面)是一个字符串,表示协议、服务器和要访问的“文档”的名称。这个uri(用户界面)还可以对其他各种参数进行编码。

  • 标题包含有关请求的其他信息,也可以用于描述内容。标题是一组关键字/值对。

  • 内容是任意数量的数据。

响应对象

libwww-perl响应对象具有类名HTTP::响应。此类对象的主要属性为:

  • 代码是一个数字值,指示请求的总体结果。

  • 消息是一个简短的可读字符串,对应于代码.

  • 标题包含有关响应的附加信息并描述内容。

  • 内容是任意数量的数据。

既然我们不想处理所有可能的事情代码在我们的程序中,libwww-perl响应对象具有可用于查询这是哪种响应的方法。最常用的响应分类方法有:

成功(_success)

已成功接收、理解或接受请求。

错误(_E)

请求失败。服务器或资源可能不可用,对资源的访问可能被拒绝,或者其他事情可能由于某种原因而失败。

用户代理

假设我们已经创建了一个请求对象。为了获得响应

答案是您将其传递给用户代理对象,该对象负责所有需要完成的事情(如低级通信和错误处理),并返回一个响应对象。用户代理在网络上表示您的应用程序,并为您提供可以接受的接口请求然后返回响应.

用户代理是应用程序代码和网络之间的接口层。通过此接口,您可以访问网络上的各种服务器。

用户代理的类名为LWP::用户代理。每个想要通信的libwww-perl应用程序都应该至少创建一个此类对象。此对象提供的主要方法是request()。此方法需要HTTP::请求对象作为参数,并(最终)返回HTTP::响应对象。

用户代理还有许多其他属性,可用于配置它与网络和应用程序的交互方式。

  • 超时指定在库断开连接并创建内部超时响应。

  • 代理人指定应用程序在网络上显示时使用的名称。

  • 可以设置为负责运行应用程序的人员的电子邮件地址。如果设置了此选项,则地址将随每个请求发送到服务器。

  • 解析头指定是否应从<头部>HTML文档的节。

  • 代理无代理(_P)指定是否以及何时通过代理服务器。http://www.w3.org/History/1994/www/代理/

  • 资格证书提供了一种设置访问特定服务所需的用户名和密码的方法。

许多应用程序希望对其与网络的交互方式进行更多的控制,并通过细分实现这一点LWP::用户代理。该库包含一个子类,LWP::机器人UA,用于机器人应用。

示例

此示例显示了如何在实际perl代码中表示用户代理、请求和响应:

#创建用户代理对象使用LWP::UserAgent;my$ua=LWP::UserAgent->new;$ua->代理(“MyApp/0.1”);#创建请求my$req=HTTP::Request->new(POST=>'http://search.cpan.org/search');$req->content_type('应用程序/x-www-form-urlencoded');$req->content('query=libwwww-perl&mode=dist');#将请求传递给用户代理并获得响应我的$res=$ua->请求($req);#检查响应结果if($res->is_success){打印$res->content;}其他{打印$res->status_line,“\n”;}

这个$ua美元在应用程序启动时创建一次。通常应为发送的每个请求创建新的请求对象。

网络支持

本节讨论了各种协议方案和每个方案可能使用的HTTP样式方法。

对于所有请求,将添加一个“User-Agent”标头,并从$ua->代理属性,然后将请求提交给网络层。同样,从$ua->From属性初始化“From”头。

对于所有响应,库都会添加一个名为“Client-Date”的头。此标头保存应用程序收到响应的时间。标头的格式和语义与服务器创建的“Date”标头相同。您可能还会遇到其他“Client-XXX”标题。它们都是由库内部生成的,而不是从服务器接收的。

HTTP请求

HTTP请求只是传递给HTTP服务器,它决定发生什么。除了通常的“GET”、“HEAD”、“POST”和“PUT”之外,很少有服务器实现其他方法,但CGI脚本可以实现它们喜欢的任何方法。

如果服务器不可用,库将生成内部错误响应。

在通过网络发送HTTP请求之前,库会自动将“主机”和“内容长度”标头添加到HTTP请求。

对于GET请求,您可能需要添加一个“If Modified Since”或“If None Match”标头,以使请求具有条件。

对于POST请求,您应该添加“Content-Type”标头。当您尝试模拟HTML<FORM>处理时,通常应该让“Content-Type”标头的值为“application/x-www-FORM-urlencoded”。请参见lwpcok公司例如。

libwww-perl HTTP实现目前支持HTTP/1.1和HTTP/1.0协议。

该库允许您通过HTTP访问代理服务器。这意味着您可以设置库以通过HTTP协议模块转发所有类型的请求。请参见LWP::用户代理以获取此文档。

HTTPS请求

HTTPS请求是使用Netscape开发的SSL协议通过加密网络连接进行的HTTP请求。上面关于HTTP请求的所有内容也适用于HTTPS请求。此外,库将向响应中添加标题“Client-SSL-Cipher”、“Client-SSL-Cert-Subject”和“Client-SSR-Cert-Issuer”。这些标头表示使用的加密方法和服务器所有者的名称。

请求可以包含标题“If-SSL-Cert-Subject”,以使请求以服务器证书的内容为条件。如果证书主题不匹配,则不会向服务器发送任何请求,并返回内部生成的错误响应。“If-SSL-Cert-Subject”标头的值被解释为Perl正则表达式。

FTP请求

该库当前支持GET、HEAD和PUT请求。GET从FTP服务器检索文件或目录列表。PUT将文件存储在ftp服务器上。

除了用户名和密码外,您还可以为需要此功能的服务器指定ftp帐户。这是通过在请求中包含“Account”头来指定的。

可以使用基本授权指定用户名/密码,也可以在URL中进行编码。登录失败将返回带有“WWW-Authenticate:basic”的未授权响应,并且可以将其视为HTTP的基本授权。

该库通过在URL中指定“type=a”参数来支持ftp ASCII传输模式。它还支持使用“Range”标头传输ftp传输的范围。

默认情况下,目录列表未经处理即返回(从ftp服务器返回),内容媒体类型报告为“text/ftp-dir-listing”。这个文件::列表模块提供了解析这些目录列表的方法。

ftp模块还可以将目录列表转换为HTML,这可以通过标准HTTP内容协商机制进行请求(如果需要,可以在请求中添加“Accept:text/HTML”头)。

对于正常的文件检索,“Content-Type”是根据文件名后缀猜测的。请参见LWP::媒体类型.

“If-Modified-Since”请求头适用于实现MDTM公司命令。但它可能不适用于目录列表。

例子:

$req=HTTP::请求->新(GET=>'ftp://me:密码@ftp.some.where.com/');$req->header(Accept=>“text.html,*/*;q=0.1”);

新闻请求

通过NNTP协议实现对USENET新闻系统的访问。新闻服务器的名称是从NNTP_server环境变量中获得的,默认为“新闻”。无法在news:URL中指定NNTP服务器的主机名。

该库支持GET和HEAD通过NNTP协议检索新闻文章。您也可以使用post方法将文章发布到新闻组。

新闻组上的GET尚未实现。

示例:

$req=HTTP::Request->new(GET=>'新闻:abc1234@a.sn.no');$req=HTTP::Request->new(POST=>'news:comp.lang.perl.test');$req->header(主题=>“这是一个测试”,自=>'me@some.where.org');$req->内容(<<EOT);这是我们要发送到的消息的内容世界。EOT公司

Gopher请求

该库支持gopher请求的GET和HEAD方法。忽略所有请求标头值。HEAD欺骗并返回响应,甚至不与服务器对话。

Gopher菜单始终转换为HTML。

响应“Content-Type”是根据请求URL路径本身中编码的文档类型(作为第一个字母)生成的。

例子:

$req=HTTP::请求->新(GET=>'gopher://gopher.sn.no/');

文件请求

该库支持文件请求的GET和HEAD方法。支持“If-Modified-Since”标头。忽略所有其他标题。这个主办文件URL的组件必须为空或设置为“localhost”。任何其他主办值将被视为错误。

目录始终转换为HTML文档。对于普通文件,响应中的“Content-Type”和“Content-Encoding”是根据文件后缀猜测的。

例子:

$req=HTTP::Request->new(GET=>'file:/etc/passwd');

邮寄请求

您可以使用库发送(也称为“POST”)邮件消息。为请求指定的所有标头都会传递到邮件系统。“收件人”标头是从URL中的邮件地址初始化的。

例子:

$req=HTTP::Request->new(POST=>'mailto:libwww@perl.org');$req->header(主题=>“订阅”);$req->content(“请为我订阅libwww-perl邮件列表!\n”);

CPAN请求

带有方案的URL注册会计师:重定向到合适的CPAN镜像。如果您有自己的CPAN本地镜像,您可以告诉LWP将其用于注册会计师:按如下分配的URL:

$LWP::协议::cpan::cpan=“file:/local/cpan/”;

还可以从CPAN.pm的配置中选择合适的CPAN镜像,因此如果您使用了该模块,则应自动选择合适的镜像。如果这两者都不适用,则会发出重定向到通用CPAN http位置的命令。

下载最新perl的请求示例:

$req=HTTP::Request->new(GET=>“cpan:src/latest.tar.gz”);

分类和包装概述

此表应为您提供库提供的类的快速概述。缩进表示类继承。

LWP::MemberMixin——访问Perl5类的成员变量LWP::UserAgent--WWW用户代理类LWP::RobotUA——开发机器人应用程序时LWP::协议——各种协议方案的接口LWP::协议::http--http://accessLWP::协议::file--file://accessLWP::协议::ftp--ftp://访问...LWP::Authen::Basic--处理401和407响应LWP::作者::摘要HTTP::Headers--MIME/RFC822样式的头(由HTTP:∶Message使用)HTTP::消息--HTTP样式的消息HTTP::请求--HTTP请求HTTP::响应--HTTP响应HTTP::守护进程——HTTP服务器类WWW::RobotRules--解析robots.txt文件WWW::RobotRules::AnyDBM_File--永久RobotRulesNet::HTTP--低级HTTP客户端

以下模块提供了各种功能和定义。

LWP—此文件。库版本号和文档。LWP::MediaTypes--MIME类型配置(text/html等)LWP::Simple--通用函数的简化过程接口HTTP::Status--HTTP状态代码(200 OK等)HTTP::Date——HTTP日期格式的日期解析模块HTTP::协商--HTTP内容协商计算文件::Listing--分析目录列表HTML::Form--处理HTML文档中的<Form>s

更多文档

所有模块都包含其提供的接口的详细信息。这个lwpcook系列manpage是libwww-perl食谱,其中包含库的典型用法示例。您可能想看看脚本是如何lwp-请求,lwp下载,lwp转储lwp-镜子已实现。

环境

LWP使用以下环境变量:

主页

这个LWP::媒体类型函数将查找.media.types(媒体类型).mime.types文件相对于主目录的文件。

http_代理
ftp代理
xxx_代理
无代理(_P)

可以设置这些环境变量以启用通过代理服务器的通信。请参阅的描述环境代理(_P)中的方法LWP::用户代理.

性能_LWP_ENV_PROXY

如果设置为TRUE值,则LWP::用户代理将默认调用环境代理(_P)在初始化期间。这使得LWP遵守上述代理变量。

PERL_LWP_SSL_VERIFY_HOSTNAME公司

默认值验证主机名设置LWP::用户代理。如果未设置,则默认值为1。将其设置为0以禁用主机名验证(libwww-perl 5.840之前的默认值)。

PERL_LWP_SSL_CA_文件
性能LWP_SSL_CA_PATH

可信证书颁发机构证书所在的文件和/或目录。请参见LWP::用户代理了解详细信息。

性能_HTTP_URI_CLASS

用于确定要实例化的URI对象。默认值为乌里。您可能希望将其设置为URI::URL与旧时代兼容。

作者

亚当·纽比、阿尔伯特·德沃尼克、亚历山大·杜雷特·卢茨、安德烈亚斯·古斯塔夫森、安德烈斯·科尼、安德鲁·皮姆洛特、安迪·莱斯特、本·科尔曼、本杰明·洛、本·蒂利、布莱尔·扎贾克、鲍勃·达尔格利什、布克、布拉德·休斯、布莱恩·穆雷尔、布莱恩·麦考利、查尔斯·傅、查尔斯·莱恩、克里斯·南多、克里斯汀·吉尔摩、,Chris W.Unger、Craig Macdonald、Dale Couch、Dan Kubb、Dave Dunkin、Dave W.Smith、David Coppit、David Dick、David D.Kilzer、Doug MacEachern、Edward Avis、erik、Gary Shea、Gisle Aas、Graham Barr、Gurusamy Sarathy、Hans de Graaff、Harald Joerg、Harry Bochner、Hugo、Ilya Zakarevich、INOUE Yoshinari、Ivan Panchenko、Jack Shirazi、James Tillman、,简·杜布瓦(Jan Dubois)、贾里德·莱茵(Jared Rhine)、吉姆·斯特恩(Jim Stern)、若昂·洛佩斯(Joao Lopes)、约翰·克拉尔(John Klar)、约翰尼·李(Johnny Lee)、乔什·克罗宁戈尔(Josh Kronengold)、乔什·雷(Josh Rai)、约书亚·查马斯(Joshua Chamas)、乔舒利特(Joshu Hoblitt)、卡尔蒂克·苏巴拉奥(Kartik Subbarao)、长野庆一郎(Keichiro Nagano)、肯·威廉姆斯(Ke,Martijn Koster、Martin Thurn、Matthew Eldridge、Matthew.van。艾尔德、马特军士长、迈克尔·蔡斯、迈克尔·夸兰塔、迈克尔·汤普森、迈克·席利、莫西·卡明斯基、内森·托金顿、尼古拉·朗费尔特、诺顿·艾伦、奥利·贝茨、保罗·辛德、佩特姆、菲利普·冈瑟、丹尼尔·布恩兹利、蓬华林、拉多斯瓦夫·齐林斯基、拉杜·格里布、兰德尔·施瓦茨、理查德·陈、罗宾·巴克、罗伊·菲尔丁、,Sander van Zoest、Sean M.Burke、shildreth、Slaven Rezic、Steve A Fink、Steve Hay、Steven Butler、Steve_Kilbane、Takanori Ugai、Thomas Lotterer、Tim Bunce、Tom Hughes、Tony Finch、Ville Skyttä、Ward Vandewege、William York、Yale Huang和Yitzchak Scott-Thoennes。

LWP在动机、设计和代码方面都得益于罗伊·菲尔丁(Roy Fielding)为Perl4开发的libwww-perl库,其中包括阿尔贝托·阿科马齐(Alberto Accomazi)、詹姆斯·凯西(James Casey)、布鲁克斯·卡特(Brooks Cutter)、马蒂恩·科斯特(Martijn Koster)、奥斯卡·尼尔斯特拉斯(Oscar Nierstrasz)、梅尔·梅尔切纳(Mel Melchner)、格特詹·凡·奥斯滕(Gertjan van Oosten)、杰瑞德·莱茵(Ja,Waldemar Kebsch、Tony Sanders和Larry Wall;有关详细信息,请参阅libwww-perl-0.40库。

版权

版权所有1995-2009,Gisle Aas版权所有1995,Martijn Koster

这个库是自由软件;您可以重新发布它和/或使用与Perl本身相同的条款对其进行修改。

可利用性

CPAN可能会提供此库的最新版本,以及:

http://github.com/libwww-perl/libwww-perl

讨论此代码的最佳位置是<libwww@perl.org>邮件列表。