扶凯

取势 明道 优术

作者为 扶 凯 发表

 这是译文,原文件地址:http://advent.plackperl.org/2009/12/day-2-hello-world.html

我这是我们学习任何语言的第一个程序.就是打印 "Hello World",我们 PSGI 的学习也使用这个传统的习惯吧.
注:现在这个是写在原生的 PSGI 程序,让你了解做了些什么事情,但在现实中你不应该这么操作,除非你是在开发一个 Web应用框架.否则,你应该使用支持 PSGI 现有的框架之一,如果 dancer 和 Catalyst之类.

Hello, World
这是一个非常小的代码来打印 "Hello World" 的信息给你的客户端

my $app = sub {
    return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello World' ] ];
};

PSGI 的应用,是一个 Perl 的函数引用.我们通常给这个引用存到一个叫 $app 的变量(你可以选择你自己喜欢的).他会得到一个 $env 的参数.这个函数返回一个数组的引用包含着状态码,header 和 body.
给你的代码存成一个叫 hello.psgi 的文件,然后使用 plackup 的命令来运行它

 

 

$ plackup hello.psgi

HTTP::Server::PSGI: Accepting connections at http://0:5000/

 

plackup 运行你的应用,通过默认自己本身的 HTTP 服务模型,默认的模型是 HTTP::Server::PSGI .会打开你本地的 5000 端口,然后你打开 URL http://127.0.0.1:5000/ 就能见到 "Hello World" 的网页

一个复杂一点的例子
Hello World 基本上是我们想得到的最简单的代码,所以我们在这来做一些别的事.来通过 PSGI 来显示客户端的 IP .

my $app = sub {
    my $env = shift;
    return [
        200, 
        ['Content-Type' => 'text/plain'],
        [ "Hello stranger from $env->{REMOTE_ADDR}!"],
    ];
};

这段代码会通过 PSGI 来显示远程打开这个端口的当前 IP .如果你在本地打开,会显示 127.0.0.1 .这个 PSGI 的环境中的 env 的 hash 包含一些你 HTTP 连接的信息.象连接进来的 HTTP 的头和请求的路径.就象通知我们写的 CGI 的环境变量.

 

PSGI 怎么样显示一些我们指定本地文件的内容.

my $app = sub {
    my $env = shift;
    if ($env->{PATH_INFO} eq '/favicon.ico') {
        open my $fh, "<:raw", "/path/to/favicon.ico" or die $!;
        return [ 200, ['Content-Type' => 'image/x-icon'], $fh ];
    } elsif ($env->{PATH_INFO} eq '/') {
        return [ 200, ['Content-Type' => 'text/plain'], [ "Hello again" ] ];
    } else {
        return [ 404, ['Content-Type' => 'text/html'], [ '404 Not Found' ] ];
    }
};

这个应用会显示 favicon.ico 出来,当你请求象 /favicon.ico 的地址时.这时如果打开的地址不是 root 就会显示 404 的回应 HTTP 头.你也能看到 Perl 的句柄怎么使用到 PSGI 的响应中的.你可以修改你的 HTTP 的状态码来显示不同的内容.

 

来了就留个评论吧! 2个评论



    Sujoe 2013年12月3日 的 08:05

    非常感谢你的翻译!之前看了原版虽然看了,但是还是比较迷糊,现在再来看你的翻译版以后豁然开朗,估计英语水平有限,呵呵,总之感谢。