如何通过命令行将POST和GET数据发送到Perl CGI脚本?
我试图通过命令行参数发送get或post。也就是说,在通过浏览器进行测试之前,在命令行中测试脚本(服务器有问题)。我试着在网上搜索,我想我可能使用了不正确的术语,因为我什么都没有得到。我知道这是可能的,因为我看到有人这么做。我只是不记得是怎么做到的如何通过命令行将POST和GET数据发送到Perl CGI脚本?,perl,command-line,post,cgi,get,Perl,Command Line,Post,Cgi,Get,我试图通过命令行参数发送get或post。也就是说,在通过浏览器进行测试之前,在命令行中测试脚本(服务器有问题)。我试着在网上搜索,我想我可能使用了不正确的术语,因为我什么都没有得到。我知道这是可能的,因为我看到有人这么做。我只是不记得是怎么做到的 谢谢!:) 是的,可以从命令行绕过服务器执行此操作。本页解释了所有内容:(特别是该页的第6项)。在此,我引述最重要的部分: 使用 方法,只需设置 查询字符串环境变量 因此。如果您使用的是Windows, 您可以使用以下命令 运行前在DOS窗口中的行
谢谢!:) 是的,可以从命令行绕过服务器执行此操作。本页解释了所有内容:(特别是该页的第6项)。在此,我引述最重要的部分: 使用 方法,只需设置 查询字符串环境变量 因此。如果您使用的是Windows, 您可以使用以下命令 运行前在DOS窗口中的行 同一窗口中的脚本: 设置查询字符串=收件人=John@Doe.com&Fullname=M+Name 使用 POST方法,将下面的行放入 名为testinput.txt的文本文件 接受者=John@Doe.com&Fullname=M+Name 然后将该文件作为输入重定向到 剧本。在Unix系统上以及 在Windows的MSDOS提示下,您可以 这样做: perl-w scriptname.pl
您使用的是标准CGI模块吗 例如,使用以下程序(注意
使用CGI
的参数中的-debug
)
您可以在命令行上输入它的参数:
$ ./prog.cgi foo=bar baz=quux
Content-type: text/plain
foo => bar
baz => quux
$./prog.cgi foo=bar baz=qux
内容类型:文本/纯文本
foo=>bar
baz=>qux
您也可以通过标准输入来执行此操作:
$ ./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
#!/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
美元/prog.cgi
(脱机模式:在标准输入上输入名称=值对;完成后按^D或^Z)
foo=bar
baz=qux
^D
内容类型:文本/纯文本
foo=>bar
baz=>qux附带了现成的脚本,可以从命令行使用。检查系统中的
GET
和POST
脚本。要从命令行测试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数据:
$ ./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
#!/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
#/bin/bash
导出内容长度=$(perl-e“print-sq/post\u data/”);
导出HTTP_COOKIE=。。。
导出HTTP_HOST=test.example.com
导出HTTP_REFERER=。。。
导出HTTP\u用户\u代理=。。。
导出路径\u信息=。。。
导出查询字符串=$(cat查询字符串);
导出请求\方法=POST
perl program.cgi
您可以根据需要进行修改,每次您想要测试程序时,都可以更改查询字符串或post数据文件中的数据。如果您不想在shell脚本中执行此操作,那么制作包装器Perl脚本也同样容易。在Windows中,您可以使用VBScript编写一个命令行util,该命令行util调用MS XML库:
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请求,可以从命令行使用。我被“如何通过命令行向Perl CGI脚本发送POST和获取数据”这一问题弄糊涂了,并认为这是关于从未指定的客户端操作系统通过命令行向Perl CGI脚本发送POST和获取数据的问题。以前的讨论,但我一直在寻找同样的答案——所以对于那些追随我的人来说——这就是我发现的 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.
要提供cgi脚本发布数据,请执行以下操作:
$ echo -n 'a=b;c=d' | REQUEST_METHOD=POST CONTENT_LENGTH=999 perl index.cgi
要提供cgi脚本以获取数据,请执行以下操作:
$ perl index.cgi 'a=b;c=d'
如果您不想更改perl脚本,可以至少设置两个环境变量来调用它,其他人已经提到过。要模拟GET请求,请执行以下操作:
shell$ QUERY_STRING=limit=20 REQUEST_METHOD=GET ./events_html.pl
这是www.myserver.org/events_html.pl?limit=20的控制台快捷方式。作为参考,环境变量/标准输入方法适用于任何CGI应用程序,无论是Perl还是其他应用程序。这个建议缺失了很多,更不用说它的示例命令行没有工作的希望。这是另一回事。他想从命令行(没有服务器)运行一个CGI脚本来测试它。他想在命令行上运行一个脚本来测试它。没有服务器。