Perl CGI中的GET与POST
在Perl中,通用网关接口(CGI)只不过是一个协议,它定义了网络服务器与一些可执行程序之间的互动,以产生动态网页。基本上,它显示了网络服务器如何将信息发送给程序,而程序将信息发回给网络服务器,反过来又可以发回给浏览器。
GET 和 POST 是不能互换的,这两种类型是不同的。代理服务器可能会缓存 GET 请求的输出。 GET 方法是所有网络请求的默认方法,用于将信息从浏览器传递给网络服务器,它还会创建一个长字符串,显示在浏览器的URL框中。它将加密的用户信息附在页面请求中。页面和加密的信息用 ? 字符隔开:
例子
**http://servername.com/cgi-bin/script_name.cgi or.pl?key1=value1 &key2=value2……. **
这些信息是通过 QUERY_STRING 头传递的,通过使用 QUERY_STRING 环境变量,可以很容易地在你的CGI程序中访问。由于 GET 方法有大小限制,一个请求字符串只能有1024个字符。信息可以通过简单地连接 键值 对和任何URL来传递。
注意: 如果你正在处理密码或任何其他敏感信息,以便将其传递给服务器,那么使用 GET 方法不是一个好的选择。
例子
<html>
<head></head>
<body>
<b> Search Your Query:</b><br>
<FORM action="Gfg_get.pl" method = "GET">
<input type="text" name="q" size="20" maxlength="120">
<input type="submit" value="Search"><br>
<input type="radio" name="l" value="Web" checked>Web
<input type="radio" name="l" value="India">IND
</FORM>
</body>
</html>
输出:
上述GET方法形式的Perl-CGI脚本
#!"c:\xampp\perl\bin\perl.exe"
buffer =ENV{'QUERY_STRING'};
#split information into key/value pairs
@pairs = split(/&/, buffer);
foreachpair (@pairs)
{
(name,value) = split(/=/, pair);
value =~ tr/+/ /;
value =~ s/%([a-fA-F0-9] [a-fA-F0-9])/pack("C", hex(1))/eg;
value =~ s/~!/ ~!/g;
FORM{name} =value;
}
SearchTerm =FORM{'q'};
Location =FORM{'l'};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>GeeksForGeeks - Get Method</title>";
print "</head>";
print "<body>";
print "<h3>Hello You searched 'Location' for 'SearchTerm'<br>
Few Matches Found!<br>
<br>
Match 1<br>
Match 2<br>
Match 3<br>
Match 4<br>
etc.....</h3>";
print "</body>";
print "</html>";
1;
输出:
如上所示,在输出图像中,信息是与URL一起传递的。
http://localhost/xampp/cgi-bin/Gfg_get.pl?q=music &l=Web
相比之下, POST 方法是向CGI程序传递信息的最可靠方法。一般来说,当信息被要求上传到服务器上时,就会使用 POST 方法。为了上传大量的数据, POST 方法被认为比 GET 方法更适合,因为没有数据出现在URL框中。与 GET 方法类似,信息也被打包,但它不是在URL框中的 “? “之后以文本字符串的形式发送,而是通过Perl/CGI程序可以访问的不同路径,以单独的信息形式发送到服务器。
例子
<head></head>
<body>
<b>Please Fill in the Information:</b><br>
<form action="GfG_post.pl" method="post">
First Name:<br>
<input type="text" name="first_name" size="25" maxlength="100"><br>
Last Name:<br>
<input type="text" name="last_name" size="25" maxlength="100"><br>
<br>
Languages:<br>
<input type="checkbox" name="python" value="yes">Python
<input type="checkbox" name="java" value="yes">Java
<input type="checkbox" name="kotlin" value="yes">Kotlin
<input type="checkbox" name="perl" value="yes">Perl
<input type="checkbox" name="swift" value="yes">Swift
<br>
Payment: <select name=payment>
<option>---Select---</option>
<Option value="Paypal"> Paypal </option>
<Option value="Internet Banking"> Internet Banking </option>
<Option value="Credit Card"> Credict Card </option>
<Option value="Paytm"> Paytm </option>
</select><br>
<br>
First Time Customer?<br>
<input type="radio" name="first_time" value="Yes">Yes
<input type="radio" name="first_time" value="No">No<br>
<br>
Feedback:<br>
<textarea wrap= "virtual" name="feedback" cols="25" rows="3"></textarea><br>
<br>
<input type="submit" value="Place Order">
</form>
</body>
</html>
输出:
上述POST方法的Perl-CGI脚本 。
#!"c:\xampp\perl\bin\perl.exe"
read (STDIN, buffer,ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, buffer);
foreachpair (@pairs)
{
(name,value) = split(/=/, pair);
value =~ tr/+/ /;
value =~ s/%([a-fA-F0-9] [a-fA-F0-9])/pack("C", hex(1))/eg;
value =~ s/~!/ ~!/g;
FORM{name} =value;
}
if(FORM{python})
{
python_flag ="YES";
}
else
{
python_flag ="NO";
}
if(FORM{java})
{
java_flag ="YES";
}
else
{
java_flag ="NO";
}
if(FORM{kotlin})
{
kotlin_flag ="YES";
}
else
{
kotlin_flag ="NO";
}
if(FORM{perl})
{
perl_flag ="YES";
}
else
{
perl_flag ="NO";
}
if(FORM{swift})
{
swift_flag ="YES";
}
else
{
swift_flag ="NO";
}
first_name= FORM{'first_name'};last_name= FORM{'last_name'};payment_method= FORM{'payment'};first_time= FORM{'first_time'};feed_back= FORM{'feedback'};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>GeeksForGeeks - Post Method</title>";
print "</head>";
print "<body>";
print "<h3>Hellofirst_name last_name</h3>";
print "<h3>Here is your Purchased Order!</h3>";
print "<h3>Python:python_flag</h3>";
print "<h3>Java: java_flag</h3>";
print "<h3>Kotlin:kotlin_flag</h3>";
print "<h3>Perl: perl_flag</h3>";
print "<h3>Swift:swift_flag</h3>";
print "<h3>Payment Method: payment_method</h3>";
print "<h3>First Time Customer:first_time</h3>";
print "<h3>Feedback: $feed_back</h3>";
print "</body>";
print "</html>";
1;
输出:
从上图可以看出,使用 POST 方法后,信息被上传到服务器,而没有出现在URL框中。这使得通过互联网发送的数据与 GET 方法相比更加安全。