如何通过命令行将POST和GET数据发送到Perl CGI脚本?

时间:2010-02-08 19:11:27

标签: perl command-line post cgi get

我正在尝试通过命令行参数发送get或post。那是在我通过浏览器测试之前在命令行中测试脚本(服务器有问题)。我尝试在线搜索,我想我可能使用了不正确的术语,因为我什么也没得到。我知道这是可能的,因为我看到有人这样做。我只是不记得它是如何完成的。

谢谢! :)

8 个答案:

答案 0 :(得分:21)

您使用的是标准CGI模块吗?

例如,使用以下程序(-debug的参数中注意use CGI

#! /usr/bin/perl

use warnings;
use strict;

use CGI qw/ :standard -debug /;

print "Content-type: text/plain\n\n",
      map { $_ . " => " . param($_) . "\n" }
      param;

您在命令行上输入参数:

$ ./prog.cgi foo=bar baz=quux
Content-type: text/plain

foo => bar
baz => quux

您也可以通过标准输入执行此操作:

$ ./prog.cgi
(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)
foo=bar
baz=quux
^D
Content-type: text/plain

foo => bar
baz => quux

答案 1 :(得分:19)

要从命令行测试CGI程序,您可以伪造服务器为程序创建的环境。 CGI.pm有一个特殊的离线模式,但我经常发现它更容易不使用,因为我需要为我的程序通常期望的其他一切做额外的设置。

根据脚本的实现,这涉及设置许多环境变量,您可以从假装成服务器的包装脚本中执行此操作:

 #!/bin/bash

 export HTTP_COOKIE=...
 export HTTP_HOST=test.example.com
 export HTTP_REFERER=...
 export HTTP_USER_AGENT=...
 export PATH_INFO=
 export QUERY_STRING=$(cat query_string);
 export REQUEST_METHOD=GET

 perl program.cgi

如果您正在为POST请求执行此操作,则环境略有不同,您需要在标准输入上提供POST数据:

 #!/bin/bash

 export CONTENT_LENGTH=$(perl -e "print -s q/post_data/");
 export HTTP_COOKIE=...
 export HTTP_HOST=test.example.com
 export HTTP_REFERER=...
 export HTTP_USER_AGENT=...
 export PATH_INFO=...
 export QUERY_STRING=$(cat query_string);
 export REQUEST_METHOD=POST

 perl program.cgi < post_data

您可以根据需要使用它,并且每次要测试程序时,都会更改query_string或post_data文件中的数据。如果您不想在shell脚本中执行此操作,那么创建包装器Perl脚本也同样容易。

答案 2 :(得分:5)

旧讨论,但我一直在寻找相同的答案 - 所以对于那些关注的人 - 这就是我发现的

RTFM!来自CGI手册页(还有更多) 调试     如果从命令行或perl运行脚本     调试器,您可以向脚本传递关键字列表或参数=值     在命令行或标准输入上对(你不必     担心欺骗你的脚本从环境中读取     变量)。您可以传递以下关键字:

    your_script.pl keyword1 keyword2 keyword3

or this:

   your_script.pl keyword1+keyword2+keyword3

or this:

    your_script.pl name1=value1 name2=value2

or this:

    your_script.pl name1=value1&name2=value2

To turn off this feature, use the -no_debug pragma.

答案 3 :(得分:3)

如果您不想更改perl脚本,可以使用至少两个环境变量集来调用它,正如其他人已经提到的那样。要模拟GET请求:

shell$ QUERY_STRING=limit=20 REQUEST_METHOD=GET ./events_html.pl

这是www.myserver.org/events_html.pl?limit=20

的控制台快捷方式

答案 4 :(得分:1)

是的,可以从命令行执行此操作,绕过您的服务器。此页面解释了所有:Perl CGI debugging (sitewizard.com)(特别是该页面上的第6项)。在这里,我引用最重要的部分:

  

使用。离线测试脚本   GET方法,只需设置   QUERY_STRING环境变量   因此。如果您使用的是Windows,   您可以使用以下命令   在运行之前在DOS窗口中排队   同一个窗口中的脚本:

     

设置QUERY_STRING=recipient=John@Doe.com& Fullname = M + Name

     

使用。离线测试脚本   POST方法,把下面的行放到一个   名为testinput.txt的文本文件。

     

recipient=John@Doe.com&全名= M +名称

     

然后将该文件重定向为输入   剧本。在Unix系统上以及   在Windows的MSDOS提示下,你可以   这样做:

     

perl -w scriptname.pl&lt; testinput.txt

     

然后您的脚本将收到该脚本   输入好像是由a发送的   网站上的表格。检查错误   perl spouts的消息,如果有的话   帮助您跟踪问题   脚本。

答案 5 :(得分:0)

给cgi脚本发布数据:

$ echo -n 'a=b;c=d' | REQUEST_METHOD=POST CONTENT_LENGTH=999 perl index.cgi

给cgi脚本获取数据:

$ perl index.cgi 'a=b;c=d'

答案 6 :(得分:-1)

LWP附带现成的脚本,可以从命令行使用。检查系统中的GETPOST脚本。

答案 7 :(得分:-1)

在Windows中,您可以使用VBScript编写调用MS XML库的命令行util:

Dim XMLHttp : Set XMLHttp = CreateObject("Microsoft.XMLHTTP")
On Error Resume Next

strIPAddress = WScript.Arguments(0)
strMACAddress = WScript.Arguments(1)
strSubnetMask = WScript.Arguments(2)

On Error Goto 0

WScript.Echo "Attempting to wake host " & strIPAddress & " on NIC " & strMACAddress &
"using netmask " & strSubnetMask

strGetUrl = http://wolService/WolService/WolService.asmx/WakeBroadcast?hostIP=" &
strIPAddress & "&macAddress=" & strMACAddress & "&subnetMask=" & strSubnetMask

XMLHttp.Open "GET", strGetUrl, False
XMLHttp.Send ""

WScript.Echo XMLHttp.ResponseText

编辑:此脚本发送HTTP请求,可以从命令行使用。我对如何通过命令行发送POST和GET数据到Perl CGI脚本的问题感到困惑,并认为这是关于通过命令行从未指定的客户端操作系统发送POST和GET数据到Perl CGI脚本。