理解这个 Plack 实现
understanding this Plack implementation
我正在看一个使用 Plack 的 Web 服务的奇怪实现,我不太明白所有部分是如何组合在一起的(一位同事从教程中复制并修改了它,但他找不到不再教程)。
首先,这段代码确实有效,尽管它很奇怪。
这是我所知道的:在高层次上,这段代码实现了一个网络服务。由于 Plack 的约定,此文件必须 return 一个将请求参数作为输入的方法,然后 return 一个 HTTP 代码和正文。这就是为什么有 "my $app = sub {"。假设这是文件的最后一行(app.psgi),它将是文件的 return 值。
我不明白某些以 "return sub." 开头的内容,我认为这实际上是覆盖 "my $app = sub {",因为现在这是文件将要 return 的功能。
但是,这可能是错误的,因为它似乎需要不同的论据。它没有采用 $env(这是关于请求的信息,包括 GET 参数),而是采用参数 $responder。当我打印出它的类型时,它是 CODE。我不知道那是什么意思。
然后下一行似乎同时 return 一个 HTTP 代码(开始我们的响应)并让一个 writer 写入额外的数据。之后的一切都有意义。
所以总而言之,我需要帮助来理解第二种方法在做什么,以及它的参数的性质是什么。非常感谢。
use strict;
use warnings;
use Plack::Request;
use POSIX ":sys_wait_h";
use IO::Handle;
STDOUT->autoflush(1);
my $app = sub {
my $env = shift;
my $req = Plack::Request->new($env);
print "Worker PID: $$\n";
my $params = $req->parameters();
return sub {
my $responder = shift;
#this will print "responder type: CODE"
print "responder type: " . (ref $responder) . "\n";
my $writer = $responder->(
[ 200, [ 'Content-Type', 'application/html' ]]);
$writer->write("some content");
$writer->close();
}
}
在子中使用 return
仅在子 运行 时生效,而不是在 returned 时生效。
应用程序可以 return 代码参考,而不是直接 returning 响应:
Applications MUST return a response as either a three element array reference, or a code reference for a delayed/streaming response.
详细信息在 PSGI 中的 延迟响应和流式传输正文 下进行了描述。
我正在看一个使用 Plack 的 Web 服务的奇怪实现,我不太明白所有部分是如何组合在一起的(一位同事从教程中复制并修改了它,但他找不到不再教程)。
首先,这段代码确实有效,尽管它很奇怪。
这是我所知道的:在高层次上,这段代码实现了一个网络服务。由于 Plack 的约定,此文件必须 return 一个将请求参数作为输入的方法,然后 return 一个 HTTP 代码和正文。这就是为什么有 "my $app = sub {"。假设这是文件的最后一行(app.psgi),它将是文件的 return 值。
我不明白某些以 "return sub." 开头的内容,我认为这实际上是覆盖 "my $app = sub {",因为现在这是文件将要 return 的功能。
但是,这可能是错误的,因为它似乎需要不同的论据。它没有采用 $env(这是关于请求的信息,包括 GET 参数),而是采用参数 $responder。当我打印出它的类型时,它是 CODE。我不知道那是什么意思。
然后下一行似乎同时 return 一个 HTTP 代码(开始我们的响应)并让一个 writer 写入额外的数据。之后的一切都有意义。
所以总而言之,我需要帮助来理解第二种方法在做什么,以及它的参数的性质是什么。非常感谢。
use strict;
use warnings;
use Plack::Request;
use POSIX ":sys_wait_h";
use IO::Handle;
STDOUT->autoflush(1);
my $app = sub {
my $env = shift;
my $req = Plack::Request->new($env);
print "Worker PID: $$\n";
my $params = $req->parameters();
return sub {
my $responder = shift;
#this will print "responder type: CODE"
print "responder type: " . (ref $responder) . "\n";
my $writer = $responder->(
[ 200, [ 'Content-Type', 'application/html' ]]);
$writer->write("some content");
$writer->close();
}
}
在子中使用 return
仅在子 运行 时生效,而不是在 returned 时生效。
应用程序可以 return 代码参考,而不是直接 returning 响应:
Applications MUST return a response as either a three element array reference, or a code reference for a delayed/streaming response.
详细信息在 PSGI 中的 延迟响应和流式传输正文 下进行了描述。