【问题标题】:How to handle POST request to PERL from html如何处理从 html 到 PERL 的 POST 请求
【发布时间】:2015-05-25 23:35:13
【问题描述】:

我正在编写一个小型 cPanel 插件,它基本上通过对 perl 文件的 ajax 请求将 html 表单提交到 perl 文件。

请求的类型是 POST,因为我需要向脚本发送一些数据。

我的问题是如何在 perl 中处理 POST 数据?

现在,我发现 CGI 库的实现很少,但是我没有作为默认 cPanel perl 模块使用。此外,我发现 LWP 库的示例很少,但是我无法理解这些示例。有人可以给我任何建议吗?

谢谢!

【问题讨论】:

  • $cgi->postdata,IIRC。阅读文档
  • $cgi 使用了 cgi perl 库,该库在 cPanel 服务的默认 perl 模块集中不可用。我知道这是一个选项,但是我想坚持使用默认的 perl 模块集。
  • 嗯? 1. CGI.pm 是 Perl 自带的。 2. 你是要我们在这里复制 CGI.pm 吗?
  • @SimeonMitev:是什么让您认为CGI 不是“默认perl 模块集” 的一部分?我看到您将其称为cgi,但如果您在程序中使用use cgi,则将找不到它。它拼写为CGI,您需要use CGI 才能找到它
  • 其实我觉得我现在明白你的意思了,请原谅@ikegami,谢谢@Borodin!

标签: perl post cpanel


【解决方案1】:

所有您需要知道的都在RFC3875通用网关接口版本 1.1 的规范

本质上,CGI 程序通过环境变量和STDIN 输入通道传递有关传入请求消息的信息。如果 CGI 程序是 Perl 程序,则可以通过内置哈希 %ENV 访问环境变量,其中将包含一组固定值,例如 REQUEST_METHOD(通常为 HEADGET , 或POST) 或CONTENT_LENGTH

消息体通过其 STDIN 通道传递给 CGI 程序,CONTENT_LENGTH 的值表示应该从通道中读取多少字节才能获取完整的消息体

对于代表来自浏览器的表单输入的POST 消息,REQUEST_METHOD 显然是POSTCONTENT_TYPE 将是 application/x-www-form-urlencoded(除非表单字段之一是文件上传); CONTENT_LENGTH 将保存请求消息正文中的数据字节数,这是 CGI 程序应该从 STDIN 读取的数据量。这应该使用read STDIN 而不是通常的<STDIN> 来完成,因为服务器可能不会在有效的正文数据之后放置EOF。你的代码看起来像

my $bytes_read = read STDIN, my $form_data, $ENV{CONTENT_LENGTH}

之后表单数据将以与GET URL 的查询部分相同的格式保存在$form_data 中(这就是内容类型的urlencoded 部分的含义)

如果您需要进一步了解 CGI 环境提供和期望的内容,请查看我在上面链接的 RFC。阅读起来相当简单

【讨论】:

    【解决方案2】:

    Borodin 的回答说明了一切。基本上,你不需要 CGI.pm overhead:

    #!/usr/bin/perl -T
    use strict;
    use warnings;
    
    my %form;
    if ($ENV{REQUEST_METHOD} eq 'POST') {
        read(STDIN, my $form_data, $ENV{CONTENT_LENGTH})
          or die "$!\n";
    
        # URL decode
        chomp($form_data);
        $form_data =~ tr/+/ /;
        $form_data =~ s/%([a-f0-9][a-f0-9])/chr(hex($1))/egi;
    
        foreach (split /&/, $form_data) {
            # trim spaces
            s/^\s+|\s+$//g;
    
            # get the URL param
            my($key, $value) = split(/=/, $_, 2);
            $form{$key} = $value || '';
        }
    }
    

    二分法

    HTML <input type="text" name="email" />

    CGI my $email = $form{email};

    【讨论】:

      【解决方案3】:
      use CGI qw( );
      my $cgi = CGI->new();
      my $json = $cgi->param('POSTDATA');
      

      【讨论】:

      • 我已将此答案标记为正确答案,因为这正是我想要的,但是我要感谢@Borodin 对 STDIN 方法的详细解释。不幸的是,这种方法不适合我对通过 Ajax 请求传递给 perl 脚本的 3 个变量进行简单检查的需要。然后按照上面的建议使用以下代码检查变量: my $q = new CGI;我的 $combineCSS = $q->param('combineCSS');我的 $extendCache = $q->param('extendCache');我要衷心感谢所有为像我这样的新手抽出时间的人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多