名称
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::PSGI或CGI::仿真::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本身相同的条款对其进行修改。