【问题标题】:How to get query string parameters from POST request in CGI Perl script?如何从 CGI Perl 脚本中的 POST 请求中获取查询字符串参数?
【发布时间】:2019-05-12 07:35:11
【问题描述】:

您可以使用以下代码在 CGI 脚本中获取查询参数:

#!C:\Perl64\bin\perl.exe

use CGI;

my $cgi = CGI->new();

my $file = $cgi->param( "file" );
print "Content-Type: text/plain\n\n";

my $text = do {
    open(my $f, "<:encoding(UTF-8)", $file)
      or die("Can't open \$filename\": $!\n");
    local $/;
    <$f>
};

print $text;

但如果请求是 POST,这不起作用,我正在使用 fetch API 发送此请求:

await fetch('cgi-bin/script.pl?file=..\foo.php', {
   method: 'POST',
   body: 'Some Text'
}).then(r => r.text());

如果我在浏览器中打开脚本,我会得到文件的内容。有没有办法告诉 CGI 模块从 QueryString 而不是 POST 数据中获取参数?或任何其他在 Perl 中解析没有 CGI 模块的查询字符串的原始方法?

【问题讨论】:

标签: perl post cgi query-string


【解决方案1】:

用 URL 中的所有数据发出 POST 请求似乎很奇怪。为什么不直接创建GET

但是,无论如何,CGI.pm 都能满足您的需求。文档中有一个名为 Mixing post and url parameters 的部分,内容如下:

my $color = url_param('color');

脚本可以在 URL 和填写表单中接收 CGI 参数,方法是创建一个 POST 到包含查询字符串(“?”标记后跟参数)的 URL 的表单。 param() 方法将始终返回 POST 填写表单的内容,忽略 URL 的查询字符串。要检索 URL 参数,请调用 url_param() 方法。使用方法与 param() 相同。主要区别在于它允许您读取参数,但不能设置它们。

【讨论】:

  • 如果没有use CGI; my $cgi = CGI-&gt;new();,这是否可行?你没有使用$cgi-&gt;
  • @jcubic:是的,这也有效。但我从未真正看到使用 CGI 对象的意义。谁在一个程序中需要多个 CGI 对象?
  • @jcubic:另外,请阅读CGI::AlternativesPlease Don't Use CGI.pm
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 2015-08-28
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2012-02-16
  • 2017-12-09
相关资源
最近更新 更多