如何在没有任何附加模块的情况下在迷你 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->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->new->encode( Status => 'Ok' );
应该是 my $content = JSON::PP->new->utf8->encode( Status => 'Ok' );
或 my $content = encode_json( Status => 'Ok' );
以上是关于如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?的主要内容,如果未能解决你的问题,请参考以下文章
React Native - 如何在没有完全重新渲染的情况下在 ListView 中添加和附加数据
如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?
如何在没有“dist”的情况下在 NPM 上发布 TypeScript 模块?
如何在没有 Eclipse 的情况下在 websphere 中发布 Mobile First 构建代码