取势 明道 优术

作者为 扶 凯 发表

我们要理解 Plack 本身并不是一个框架,它是一个工具,并提供一系列的工具包,其中包含 PSGI 协议的服务器的实现,以及像 plackup, Plack::Test  和中间件组件.
。有些时候,我们有一些需求,并不想在后端在写应用,而是只想写一个简单的 Request/Response 风格的API 来快速实现 Web 应用程序(比如接口之类).Plack::Request 可以提供给你面象对象的方法来操作有关 PSGI 的 hash 环境和 response 的数组.象 Rack 中的 Rack::Request 和 Response 对象.你也可以基于 PSGI 的应用中来做 requests/responses 的基类.

使用 Plack::Request 和 Response
Plack::Request 能取到所有 PSGI 的环境变量.如下:

use Plack::Request;

my $app = sub {
    my $req = Plack::Request->new(shift);

    my $name = $req->param('name');
    my $res  = $req->new_response(200);
    $res->content_type('text/html');
    $res->content("Hello World");

    return $res->finalize;
};

如果你从 HTTP::Engine, 迁移过来,你唯一需要改变,是该 Plack 的应用程序中第一行中使用 Plack::Request 取出 PSGI 的 ENV(shift),接下来然后调用 finalize 得到组成了数组的 Response 的对象,这个其实就是组成一个象 [200, [Content-Type => ''text/html"], ["Hello World"]] 的结构.
全部其它的方法提供了象 path_info, uri, param, redirect 等等,就象 HTTP::Engine::Request 本身的 Response 对象一样,也很象 Catalyst 的 Response 对象.所以这个东西主要是提供二个功能,解析 Request  和组成 Response 来做响应。

 

Plack::Request 和 Plack
Plack::Request 是 Plack 中的一部分,你的框架可以使用 Plack::Request 来处理参数,也可以使其运行在其他 PSGI 如 mod_psgi 服务器实现.
在 .psgi 代码中直接使用 Plack::Request 可以非常快又简单的测试你的代码,但不十分推荐在你在大规模应用程序中使用.Plack::Request 相当于你写了 1000 行的 .cgi 的脚本,只是在这给这个做成了模块.
同样的道理也适用于 .psgi 文件:它最好通过类来使用扩展 Plack::Request,这样在你的 .psgi 文件中只要几行代码就行了.
Plack::Request 也支持在 Web 中通过适配 PSGI interface 来使用这个.

这是我的译文,原文地址:http://advent.plackperl.org/2009/12/day-14-use-plackrequest.html

来了就留个评论吧! 没有评论