我正在使用Plack查看一个奇怪的Web服务实现,我不太清楚所有部分是如何组合在一起的(同事们从教程中复制和修改它,但他不能这样做)再找教程。)
首先,这段代码确实有用,就像它一样奇怪。
以下是我所知道的:从较高层面来看,此代码实现了一项Web服务。由于Plack的约定,此文件必须返回一个方法,该方法将请求参数作为输入,然后返回HTTP代码和正文。这就是为什么有" my $ app = sub {"。假设这是文件中的最后一行(即app.psgi),它将是文件的返回值。
我不理解以" return sub。"开头的一些事情。我相信这基本上是覆盖了我的$ app = sub {",因为现在这是该文件将返回的函数。
但是,这可能是错误的,因为它似乎采取了不同的论点。它不需要获取$ env(这是关于请求的信息,包括GET参数),而是需要一个参数$ responder。当我打印出它的类型时,它是CODE。我不知道这意味着什么。
然后下一行似乎同时返回一个HTTP代码(开始我们的响应)并获得一个写入附加数据的编写器。之后的一切都是有道理的。
总而言之,我需要帮助理解第二种方法正在做什么,以及它的参数的性质是什么。非常感谢提前。
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();
}
}
答案 0 :(得分:3)
在sub中使用return
仅在运行sub时生效,而不是在返回时生效。
应用程序可以返回代码引用,而不是直接返回响应:
应用程序必须将响应作为三元素数组引用或延迟/流式响应的代码引用返回。
详细信息在PSGI的延迟响应和流媒体下进行了描述。