【问题标题】:CGI Perl Echo back POSTed application/x-www-form-urlencoded ContentCGI Perl Echo 返回 POSTed application/x-www-form-urlencoded 内容
【发布时间】:2013-05-29 13:49:29
【问题描述】:

我需要一个简单的基于 CGI 的 Perl 脚本来接收 POST(直接,而不是来自另一个 HTML 页面),其中 Content-Type 为 application/x-www-form-urlencoded 并回显

我收到:(编码字符串)

(如果可能的话) 解码后,字符串为:(解码后的字符串)

我是 CGI Perl 的新手,这是测试产品的一次性请求(我是系统管理员。不是程序员)。我打算在未来更深入地学习 Perl,但在这种情况下,我希望给我一个机会。

【问题讨论】:

  • perldoc.perl.org/CGI.html#SYNOPSIS 是 CGI 的良好开端。
  • "接收一个 POST(直接,而不是从另一个 HTML 页面)" — 一个 POST 请求就是一个 POST 请求。服务器不关心导致客户端生成它的原因,除非您编写代码来显式检查引荐来源网址(或者您使用类似反 CSRF 随机数的东西)

标签: perl cgi mime-types


【解决方案1】:

首先,我将快速浏览一些基础知识。

以下是 PERL/CGI 应用程序包:

use CGI;

创建 CGI 对象:

my $web = CGI->new;

在将任何 CGI 数据刷新到外流之前,请确保设置 HTTP 标头并将其写入外流。否则你最终会出现 500 错误。

设置标题:

print $web->header();
print $web->header('application/x-www-form-urlencoded');

要从 HTML 接收任何帖子数据,例如,

http://example.com?POSTDATA=helloworld

你可以使用 param() 函数:

my $data = $web->param('POSTDATA');

标量 $data 将设置为“helloworld”。

建议在分配给标量之前检查是否定义了 $web->param('POSTDATA')。

【讨论】:

  • CGI 是在 Perl 中进行 CGI 的 a 包。还有很多其他的,我会使用Plack::Handler::CGI,因为当我逃避 CGI 并使用体面的东西时它更灵活。您不想使用application/x-www-form-urlencoded 作为返回数据的内容类型,这是表单将其发布的格式,而不是发送回浏览器的有用信息。您的示例将数据提供为 GET 数据,而不是 POST。
  • 我认为 POSTDATA 专门不适用于 application/x-www-form-urlencoded 内容。我读到的文档说 Content-Type 不是 urlencoded 然后文本将被捕获在一个名为 POSTDATA 的参数中。我在这里错过了什么?
  • @GreggLeventhal — 你说得对,我以前没见过。也就是说,显然,您如何在 CGI.pm 中获取原始 POST 数据。可惜它没有使用明智的方法(例如使用不同的方法来调用它)。
猜你喜欢
  • 2021-02-03
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2019-07-28
  • 2019-09-12
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多