我有一个Perl脚本,在某些情况下需要重定向到另一个脚本并发送所有查询参数。查询参数可以包含大量数据,我不想构造和附加一个看起来很乱的POST字符串。基于一些研究,我得出了这个:
use strict;
use warnings;
use CGI;
use URI;
my $query = CGI->new();
my %lots_of_data = $query->Vars;
my $uri = URI->new('http://whatever.com/new_script.pl');
$uri->query_form(\%lots_of_data);
print $query->redirect(-location => $uri);
问题:
非常感谢!
答案 0 :(得分:1)
由于您可以控制两个脚本,因此可以使用会话。会话是服务器在本地存储客户端特定信息的任何系统,以便在为同一客户端的后续请求提供服务时进行访问。为了确定两个请求来自同一客户端,服务器向客户端提供客户端将在未来请求中提供服务器的标识符。 Cookie通常用于传输标识符,但也可以使用单个“表单”参数。
例如,如果两个脚本都可以访问同一个数据库,则可以将参数与id [1] 一起存储在数据库中,并将其从一个脚本传递到另一个脚本通过cookie(如果两个脚本在同一个域上)或通过参数
new_script.pl?sid=?????
我会让你研究实施细节。 CGI::Session可能有用。
答案 1 :(得分:1)
感谢所有想法。我决定序列化参数,然后仅使用文件名重定向到第二个脚本。
my %queryParams = $q->Vars;
my $pid = $$;
my $serializedFile = $tmpDir . "qs". $pid . ".ser"; # /tmp/qs1234.ser
nstore(\%queryParams, $serializedFile);
my $url = $cgiRoot."/cluster/drpSelectGenes.pl?pid=$pid";
print $q->redirect($url);
exit(0);
在接收端:
if ($q->param("pid")) {
my $serializedFile = $tmpDir . "qs" . $q->param('pid') . ".ser";;
my %params = %{Storable::retrieve($serializedFile)};
# move the values into the query object. (Is there a better way?)
foreach my $key (keys %params) {
my $val = $params{$key};
if ($key eq "fullID") { # convert null-delimited list into an array
my @arr = split "\0", $val;
$q->param(-name => 'fullID', -values => \@arr);
} else {
$q->param(-name => $key, -values => $val);
}
}
}
P.S。对于ikegami来说,这个应用程序确实使用了会话,但是将它们与我希望避开的数据库紧密联系起来。
答案 2 :(得分:0)
如果你需要保密参数,那么使用POST,如果你通过get得到它们,那么只需使用URI将查询参数重新链接到URL上。
您可能不需要使用URI,您可能只能将$ URI连接到$ QUERY_STRING环境变量。
如果你需要POST,那么你最终不应该有很多混乱的代码。你已经将所有参数都作为哈希。您应该只能传递散列并将其插入到POST参数中。
如果您可以使用GET,那么重定向将起作用。如果您需要发帖,那么WWW::Mechanize,HTTP::Tiny和LWP就是您的朋友。