代码之家  ›  专栏  ›  技术社区  ›  Stephen

了解此Plack实现

  •  2
  • Stephen  · 技术社区  · 8 年前

    我正在看一个使用Plack的web服务的奇怪实现,我不太明白所有部分是如何组合在一起的(一位同事从教程中复制和修改了它,但他再也找不到教程)。

    首先,这段代码确实有效,尽管很奇怪。

    我所知道的是:在较高的级别上,这段代码实现了一个web服务。由于Plack的约定,该文件必须返回一个方法,该方法将请求参数作为输入,然后返回HTTP代码和正文。这就是为什么会有“my$app=sub{”的原因。假设这是文件中的最后一行(即app.psgi),它将是文件的返回值。

    我不理解以“return sub”开头的某些内容。我认为这实际上覆盖了“my$app=sub{”,因为现在这就是文件将返回的函数。

    然而,这可能是错误的,因为它似乎采取了不同的论点。它不接受$env(这是关于请求的信息,包括GET参数),而是接受参数$responder。当我打印出它的类型时,它是代码。我不知道那是什么意思。

    然后,下一行似乎同时返回一个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();
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   choroba    8 年前

    使用 return 在中,sub仅在运行sub时生效,而不是在返回sub时生效。

    应用程序可以返回代码引用,而不是直接返回响应:

    应用程序必须以三元素数组引用或延迟/流式响应的代码引用的形式返回响应。

    有关详细信息,请参见 延迟响应和流体 在里面 PSGI .