2011-10-27 320 views
1

我正在用Perl后端创建一个Facebook应用程序。问题是,由于Facebook发送请求作为POST请求我的web应用程序,我有一个问题获取也是应用程序的基本URL的一部分的GET参数 - 实际上我只是得到POST参数从$ CGI-> Vars。如何在POST请求中获取GET和POST请求参数?

回答

13

参见CGI/MIXING POST AND URL PARAMETERS

简短版本:使用$CGI->param()作为后置参数,使用$CGI->url_param()查询字符串参数。

+0

很好的问题是,URL使用GET参数来跟踪应用程序的状态,我猜的想法是不混合GET和POST PARAMS - 除了它是部分的RFC标准我不明白为什么这很重要 - 它不会改变服务器上的任何内容,它只是检测要执行哪个步骤 – qodeninja

+2

@nodebunny,为什么重要?你的意思是“为什么他们用不同的方法获取”?要确保“在任何情况下,URL查询字符串的内容都不会干扰发布表单中类似名称的CGI参数。”根据你所说的,这个特征对你来说应该是特别重要的。 – ikegami

+0

为什么重要的是保持GET和POST分开......但我想我明白其中的含义。你不希望能够将某些东西设置为GET参数,并将其视为POST参数,否则会挫败POST的目的,对吗?然而,为了我的目的,我只寻找特定的参数,所以我猜它是一个静音点。我需要的参数无论它的获得或后置都无关紧要。但我现在更了解情况。 +1讨论 – qodeninja

5

转储CGI以支持更好的界面。 Plack的param方法返回GET和POST参数混合。

plackup -MPlack::Request -e 'sub { 
    my ($env) = @_; 
    my $r = Plack::Request->new($env); 
    return [200, ["Content-Type" => "text/plain"], [join "\n", $r->param("foo")]]; 
}' 

> lwp-request -m POST -USe 'http://localhost:5000/fnord?foo=bar;baz=quux' 
Please enter content (application/x-www-form-urlencoded) to be POSTed: 
foo=123;baz=456 
␄ 
POST http://localhost:5000/fnord?foo=bar;baz=quux 
User-Agent: lwp-request/6.03 libwww-perl/6.03 
Content-Length: 16 
Content-Type: application/x-www-form-urlencoded 

200 OK 
Date: Thu, 27 Oct 2011 21:27:46 GMT 
Server: HTTP::Server::PSGI 
Content-Length: 7 
Content-Type: text/plain 
Client-Date: Thu, 27 Oct 2011 21:27:46 GMT 
Client-Peer: 127.0.0.1:5000 
Client-Response-Num: 1 

bar 
123 
+0

+1分享plack/lwp解决方案 – qodeninja