首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解这个Plack实现

理解这个Plack实现
EN

Stack Overflow用户
提问于 2018-01-23 22:12:31
回答 1查看 213关注 0票数 2

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

首先,这段代码确实可以工作,尽管它很奇怪。

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

我不明白从“返回潜艇”开始的一些事情。我认为这实际上是覆盖"my $app = sub {",因为这是文件将返回的函数。

然而,这可能是错误的,因为它似乎需要不同的论据。它不使用$env (它是关于请求的信息,包括GET params),而是使用一个参数$responder。当我打印出它的类型时,它就是代码。我不知道那是什么意思。

然后,下一行似乎同时返回一个HTTP代码(开始我们的响应),并获得一个编写器来编写额外的数据。之后的一切都是有意义的。

因此,总之,我需要帮助理解第二个方法正在做什么,以及它的参数的性质。提前谢谢。

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-23 22:24:00

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

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

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

详细描述了延迟响应和流体在PSGI中的应用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48411691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档