如何处理 POST 来自 html 的 PERL 请求

How to handle POST request to PERL from html

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

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

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

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

谢谢!

您需要了解的一切都在 RFC3875通用网关接口版本 1.1

的规范

本质上,CGI 程序通过环境变量和 STDIN 输入通道传递有关传入请求消息的信息。如果 CGI 程序是 Perl 程序,则可以通过内置散列 %ENV 访问环境变量,它将包含一组固定值,例如 REQUEST_METHOD(通常是 HEADGETPOST) 或 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。阅读起来相当简单

use CGI qw( );
my $cgi = CGI->new();
my $json = $cgi->param('POSTDATA');

's answer says all. Basically, you don't need the 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())/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" />

CGImy $email = $form{email};