名称

Plack::Request-来自PSGI env哈希的可移植HTTP请求对象

简介

使用Plack::Request;我的$app_or_middleware=sub{my$env=移位;#PSGI环境my$req=Plack::Request->new($env);我的$path_info=$req->path_info;my$query=$req->参数->{query};my$res=$req->new_response(200);#新Plack::响应$res->finalize;};

描述

Plack::请求为跨web服务器环境的请求对象提供了一致的API。

CAVEAT公司

请注意,此模块旨在供Plack中间件开发人员和web应用程序框架开发人员使用,而不是供应用程序开发人员(最终用户)使用。

使用Plack::Request直接编写web应用程序当然是可行的,但不建议这样做:就像使用mod_perl的Apache::Request:这样做,但级别太低。

如果您正在编写一个web应用程序,而不是框架,那么建议您使用支持PSGI的web应用程序框架之一(http://plackperl.org/框架),或查看类似的模块HTTP::引擎在PSGI之上提供更高级别的请求和响应API。

如果您正在寻找一个易于使用的API来转换现有CGI应用程序以在PSGI上运行,请考虑使用CGI::PSGICGI::仿真::PSGI也。CGI::仿真::PSGI文档很好地总结了如何使用它们来转换现有CGI脚本以适应PSGI。

方法

0.99版本中不推荐使用早期版本中定义的某些方法。看看“不兼容”.

除非另有说明,否则所有方法和属性都是只读,并且像访问器一样向方法传递值并不像您期望的那样工作。

新的

Plack::请求->新($env);

创建新的请求对象。

属性

环境价值

返回共享的PSGI环境哈希引用。这是一个参考,因此在整个PSGI请求/响应周期中都会对该环境进行写入。

地址

返回客户端的IP地址(远程_ DDR).

远程主机

返回远程主机(远程_停止)客户端的。它可能是空的,在这种情况下,您必须使用地址方法和解决方案。

方法

包含请求方法(GET(获取),邮政,头部等)。

协议

返回用于当前请求的协议(HTTP/1.0或HTTP/1.1)。

请求uri

返回未编码的原始请求URI路径。你可能知道不是希望使用它来调度请求。

路径_信息

退货路径信息在环境中。使用此选项可获取请求的本地路径。

路径

类似路径_信息但回报/万一它是空的。换句话说,它返回请求URI的虚拟路径$req->基本。请参阅“调度”了解详细信息。

查询字符串

退货查询_字符串在环境中。这是请求URI中未编码的查询字符串。

脚本名称

退货脚本_名称在环境中。这是承载应用程序的绝对路径。

方案

返回方案(http协议https(https))请求的。

保护

返回true或false,指示连接是否安全(https)。

主体,输入

退货psgi输入手柄。

阶段

退货(可选)psgix.会话散列。当它存在时,您可以从这个散列中检索和存储每个会话的数据。

会话选项(_O)

退货(可选)psgix.session.options(psgix.会话.选项)散列。

记录器

退货(可选)psgix.记录器代码引用。当它存在时,您的应用程序应该使用以下方法将日志消息发送到此记录器:

$req->logger->({level=>'debug',message=>“This is a debug message”});
饼干

返回对包含cookie的哈希的引用。值是由客户端发送并经过URI解码的字符串。

如果请求中有多个同名cookie,此方法将忽略重复的cookie并只返回第一个值。如果这给您带来了问题,您可能必须使用CGI::Simple::Cookie等模块来解析$request->header(“Cookie”)自己动手。

查询_参数

返回对包含查询字符串(GET)参数的哈希的引用。此哈希引用是哈希::MultiValue对象。

body_parameters(车身参数)

返回对包含请求正文(POST)中已发布参数的哈希的引用。与相同查询_参数,哈希引用是哈希::MultiValue对象。

参数

返回一个哈希::MultiValue包含(合并)GET和POST参数的散列引用。

内容,raw_body

以未编码的字节字符串形式返回POST请求的请求内容。

uri(用户界面)

返回当前请求的URI对象。URI是使用各种环境值构造的,例如脚本_名称,路径信息,查询_字符串,HTTP_停止,服务器名称服务器端口.

每次调用此方法时,它都会返回一个新的克隆URI对象。

基础

返回当前请求的基本路径的URI对象。这就像是uri(用户界面)但最多只包含脚本_名称应用程序所在的位置。

每次调用此方法时,它都会返回一个新的克隆URI对象。

用户

退货远程_用户如果设置好了。

标题

返回一个HTTP::标头::快速对象,该对象包含当前请求的标头。

上传

返回对包含上载的哈希的引用。哈希引用是哈希::MultiValue对象和值是Plack::请求::上传物体。

内容_编码

$req->headers->content_encoding的快捷方式。

内容长度

返回Content-Length标头的原始值。

在0.9925之前,此方法是$req->headers->content_length.

内容_类型

返回Content-Type标头的原始值。

如果只需要MIME类型,而不需要任何属性(如charset),请使用$req->headers->content_type。另请参阅HTTP::Headers中的“content_type”.

在0.9925之前,此方法是$req->headers->content_type.

$req->headers->header的快捷方式。

裁判

$req->headers->referer的快捷方式。

用户代理(_A)

$req->headers->user_agent的快捷方式。

参数

使用CGI.pm-compatible param方法返回GET和POST参数。这是访问$req->参数中参数的另一种方法,以防您想要与CGI.pm对象兼容。

你是未推荐的使用此方法,因为它很容易在列表上下文中被误用,例如在哈希构造函数或方法参数中。使用参数和Hash::MultiValue。

与CGI.pm不同,它确实如此允许设置或修改查询参数。

$value=$req->param('foo');@值=$req->param('foo');@params=$req->param;
上传

访问$req->上传的方便方法。

$upload=$req->upload('field');@uploads=$req->upload('field');@字段=$req->上传;对于我的$upload($req->upload){打印$upload->filename;}
新响应(_R)
我的$res=$req->new_response;

创建新的Plack::响应对象。方便删除对的依赖Plack::响应在您的代码中轻松地在web应用程序框架中创建子类和duck类型,以及覆盖中间件中的响应生成。

哈希::MultiValue参数

可以采用一个或多个值的参数(即。参数,查询参数,body_parameters(车身参数)上传)将哈希引用存储为哈希::MultiValue对象。这意味着您可以将哈希引用用作普通哈希,其中值为总是标量(不是数组引用),因此不需要编写难看和不安全的代码裁判。。。eq“阵列”不再。

如果您明确希望获得同一个键的多个值,可以调用全部获取(_A)方法,例如:

my@foo=$req->query_parameters->get_all('foo');

你也可以打电话获取一个总是获得一个独立于上下文的参数(不同于参数),甚至打电话混合的(使用Hash::MultiValue 0.05或更高版本)以获取传统的散列引用,

my$params=$req->parameters->mixed;

其中,值要么是标量引用,要么是数组引用,这取决于输入,因此如果您已经有了处理这种丑陋的代码,那么它可能会很有用。

PARSING POST BODY和多个物体

解析请求正文的方法(内容,body_parameters(车身参数)上传)经过仔细编码,将解析后的正文保存在环境散列和临时缓冲区中,因此可以多次调用它们,并在一个请求中多次创建Plack::Request对象,它们应该安全工作,并且为了提高效率,解析请求正文的次数不会超过两次。

发货

如果您的应用程序或框架想要根据请求路径调度(或路由)操作,请确保使用$req->路径信息$req->uri->path.

这是因为路径_信息为您提供了请求的虚拟路径,而不管您的应用程序是如何装载的。如果您的应用程序是用mod_perl或CGI脚本托管的,甚至是用诸如Plack::应用程序::URLMap,请求的路径_信息总是给你行动的路径。

请注意路径信息可能会给您一个空字符串,在这种情况下,您应该假设路径是/.

您还需要使用$req->基本在模板或重定向中构建URL时作为基本前缀。最好将Plack::Request子类化并定义如下方法:

sub_uri(对于){my($self,$path,$args)=@_;my$uri=$self->base;$uri->path($uri->path.$path);如果$args;则为$uri->query_form(@$args);$uri;}

所以你可以说:

我的$link=$req->uri_for('/logout',[signof=>1]);

如果$req->基本/应用程序您将获得的完整URI/应用程序/注销?签收=1.

不相容性

在0.99版中,许多实用程序方法被删除或弃用,并且大多数方法都是只读的。在1.0001版中删除了这些方法。

所有与参数相关的方法,如参数,body_parameters(车身参数),查询_参数上传现在包含哈希::多值对象,而不是标量或数组引用取决于用户输入这是不安全的。请参见哈希::MultiValue了解有关此更改的更多信息。

$req->路径方法有一个错误,代码和文档不匹配。文档建议在以下时间后返回子请求路径$req->基本但是代码总是返回绝对URI路径。代码现在更新为的别名$req->路径信息但回报/万一它是空的。如果你需要老行为,只需打电话$req->uri->path相反。

Cookie处理简化,不使用CGI::简单::Cookie再也没有了,这意味着你不能将数组引用或散列引用设置为cookie值,并期望它被序列化。您总是需要设置字符串值,对它们进行编码或解码完全取决于您的应用程序或框架,饼干哈希引用现在返回对于Cookie而不是CGI::Simple::Cookie对象,这意味着您不再需要编写古怪的代码,例如:

$v=$req->cookies->{foo}$请求->cookie->{foo}->值:undef;

相反,只需:

$v=$req->cookies->{foo};

作者

宫川达彦

大川和弘

松野德弘

另请参阅

Plack::响应 HTTP::请求,Catalyst::请求

许可证

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