如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?

Posted

技术标签:

【中文标题】如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?【英文标题】:How to return a json in a mini web server without any additional module? 【发布时间】:2020-01-21 05:45:58 【问题描述】:

所以我的问题是我安装了 perl5.8,但我无法安装任何额外的模块。 (我是一名公务员,我必须按原样使用服务器,没有任何权利或选择我可以在上面安装什么,修改某些东西的过程需要数年时间)。

所以有一个小的网络服务器脚本:

use HTTP::Daemon;
use HTTP::Status;

(my $d = new HTTP::Daemon 
LocalAddr => '127.0.0.1',
LocalPort => 52443
) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) 
    while (my $r = $c->get_request) 
        if ($r->method eq 'GET' and $r->uri->path eq "/xyzzy") 
            # remember, this is *not* recommended practice :-)
            $c->send_file_response("D:/Script/index.html");
        
        else 
            $c->send_error(RC_FORBIDDEN)
        
    
    $c->close;
    undef($c);

我想返回一个像这样的 json: “状态”:“好的”

问候

【问题讨论】:

Perl 5.8 于 2002 年发布,已经很久没有支持了。强烈考虑升级到更新版本。 “附加模块”是什么意思?哪些模块已经可用? 我无法安装任何额外的模块 - 这很少像人们想象的那样真实。您不太可能无法使用 JSON::PP,因为它是纯 Perl(这就是“PP”的意思)。 如果您看到documenation for a recent version of HTTP::Daemon,您会发现他们已经开始使用更好的构造函数语法HTTP::Daemon-&gt;new()。请以他们为榜样,以避免您未来的潜在痛苦。 Re "我无法安装任何额外的模块",如果你可以从 SO 安装代码,你可以从 CPAN 安装代码。 【参考方案1】:

重写 example in the documentation 以返回 JSON 看起来像这样:

#!/usr/bin/perl

use strict;
use warnings;

use HTTP::Daemon;
use HTTP::Status;
use HTTP::Response;
use HTTP::Headers;
use JSON::PP;

my $headers = HTTP::Headers->new;
$headers->header(Content_Type => 'application/json');
my $content = JSON::PP->new->utf8->encode( Status => 'Ok' );

my $d = HTTP::Daemon->new || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) 
    while (my $r = $c->get_request) 
        if ($r->method eq 'GET' and $r->uri->path eq "/xyzzy") 
            $c->send_response(
                HTTP::Response->new(200, 'OK', $headers, $content)
            );
        
        else 
            $c->send_error(RC_FORBIDDEN)
        
    
    $c->close;
    undef($c);

但请注意,在这个级别编写 Web 应用程序很少有用。你真的很想安装一个 Web 框架(我喜欢 Dancer2),因为这会让你的生活更轻松。

我不确定是什么对您施加了这些限制。但是,如果您没有使用现代版本的 Perl(至少 5.10)并从 CPAN 安装模块,那么您的 Perl 开发事业将变得比需要的困难得多。

【讨论】:

谢谢,但我无法在服务器上安装任何模块。我是一名公务员,过程很糟糕。我必须使用计算机上的东西......现在我们正在考虑从 perl 5.8 切换到 python 2.6(2019 年)。所以我必须使用给定的工具......所以没有 perl json 模块 @bussirs 您可以将模块代码复制/粘贴到您的脚本中。或者使用 App::FatPacker,它会自动执行该过程。 @bussirs JSON::Tiny,Mojo::JSON 的一个分支在 CPAN 上,其设计目的是您可以完全复制 300 行并将它们粘贴到您的代码库中。这不是一个可持续的最佳实践,但完全有可能,并且与从 *** 复制代码行没有太大区别。 @bussirs Python 2 在 2019 年?只是end-of-life。似乎无论你为谁工作,都会特意为自己制造困难,对未来的态势没有任何了解。 您忘记对内容进行编码。 my $content = JSON::PP-&gt;new-&gt;encode( Status =&gt; 'Ok' ); 应该是 my $content = JSON::PP-&gt;new-&gt;utf8-&gt;encode( Status =&gt; 'Ok' );my $content = encode_json( Status =&gt; 'Ok' );

以上是关于如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 如何在没有完全重新渲染的情况下在 ListView 中添加和附加数据

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

如何在没有“dist”的情况下在 NPM 上发布 TypeScript 模块?

如何在没有 Eclipse 的情况下在 websphere 中发布 Mobile First 构建代码

如何在不重新编译的情况下在 .NET 中动态切换 Web 服务地址?

如何在没有 <reference> 的情况下在 TypeScript 中导入带有“Typings”的模块?