我在哪里可以找到HTTP :: Server :: Simple中的请求体

时间:2014-06-30 19:58:46

标签: perl http

我有以下简单的服务器:

我正在尝试找到请求正文(或内容)的位置。 我尝试过转储$self$cgi,但他们没有包含该字段(因为他们没有提供有关请求的任何信息而感到高兴)

我如何获得请求正文?

package MyWebServer;
 use strict;
 use HTTP::Server::Simple::CGI;
 use base qw(HTTP::Server::Simple::CGI);
 use Data::Dumper;

 my %dispatch = (
     '/hello' => \&resp_hello,
     # ...
 );

 sub handle_request {
     my $self = shift;
     my $cgi  = shift;

     my $path = $cgi->path_info();
     my $handler = $dispatch{$path};

     print "printing self in request".Dumper($cgi);
     my $req = $cgi->get_request;
     if (ref($handler) eq "CODE") {
         print "HTTP/1.0 200 OK\r\n";
         $handler->($cgi, "asd");

     } else {
         print "HTTP/1.0 404 Not found\r\n";
         print $cgi->header,
               $cgi->start_html('Not found'),
               $cgi->h1('Not found'),
               $cgi->end_html;
     }
 }

 sub resp_hello($$) {
     my ($cgi, $asd)  = @_;   # CGI.pm object

     my $who = $cgi->param('name');

     print $cgi->header,
           $cgi->start_html("Hello"),
           $cgi->h1("Hello world!!"),
           $cgi->h2("Azdh $asd");

           $cgi->end_html;
 }

 # start the server on port 8080
 my $pid = MyWebServer->new(8081)->background();
 print "Use 'kill $pid' to stop server.\n";

编辑:这是一个示例请求:

use strict;
require LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => "http://localhost:8081/hello");


$req->content("<foo>3.14</foo>"); # the request body 


my $resp = $ua->request($req);
if ($resp->is_success) {
    my $message = $resp->decoded_content;
    print "Received reply: $message\n";
}
else {
    print "HTTP GET error code: ", $resp->code, "\n";
    print "HTTP GET error message: ", $resp->message, "\n";
}

2 个答案:

答案 0 :(得分:1)

使用$ req = $ cgi-&gt; get_request行获取的请求对象是CGI :: Request对象。由于这是一个请求对象,因此它只有属性(传递给请求的参数)。请注意,只有响应对象才有内容。因此,要查看已传递的所有参数,可以使用as_string()对象方法,如下所述。

print $req->as_string;

有关访问请求对象的各个参数的更多信息,请参阅http://search.cpan.org/~mrjc/cvswebedit-v2.0b1/cvs-web/lib/CGI/Request.pm中的CGI :: Request文档。

答案 1 :(得分:1)

虽然有点旧,但面对同样的问题,这就是解决方案:

$ CGI-&GT; PARAM( 'POSTDATA');

这就是你需要检索身体内容。

欢呼声。