web-dev-qa-db-ja.com

コマンドラインからPOSTおよびGETデータをPerlCGIスクリプトに送信するにはどうすればよいですか?

コマンドライン引数を使用してgetまたはpostを送信しようとしています。つまり、ブラウザでテストする前に、コマンドラインでスクリプトをテストします(サーバーに問題があります)。オンラインで検索してみましたが、何も得られなかったので、間違った用語を使っていたのではないでしょうか。私は誰かがそれをするのを見たのでこれが可能であることを知っています。私はそれがどのように行われたかを覚えていません。

ありがとう! :)

19
Parris

標準の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 
(オフラインモード:標準入力で名前=値のペアを入力します。完了したら^ Dまたは^ Zを押します)
 foo = bar 
 baz = quux 
 ^ D 
コンテンツタイプ:text/plain 
 
 foo => bar 
 baz => quux
21
Greg Bacon

コマンドラインから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ファイルのデータを変更します。シェルスクリプトでこれを実行したくない場合は、ラッパーPerlスクリプトを作成するのも同じくらい簡単です。

19
brian d foy

古い議論ですが、私は同じ答えを探していました-したがって、フォローしている人のために-これは私が見つけたものです

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.
5
FredW

Perlスクリプトを変更したくない場合は、他の人がすでに述べたように、少なくとも2つの環境変数を設定して呼び出すことができます。 GETリクエストをシミュレートするには:

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

これは、www.myserver.org/events_html.pl?limit = 20のコンソールショートカットです。

3
Tom M.

はい、サーバーをバイパスして、コマンドラインからこれを行うことができます。このページではすべてを説明しています: Perl CGIデバッグ(sitewizard.com) (特にそのページの項目6)。ここで私は最も重要な部分を引用します:

GETメソッドを使用してスクリプトをオフラインでテストするには、それに応じてQUERY_STRING環境変数を設定するだけです。 Windowsを使用している場合は、同じウィンドウでスクリプトを実行する前に、DOSウィンドウで次のコマンドラインを使用できます。

qUERY_STRING = receiveient = John @ Doe.com&Fullname = M + Nameを設定します

POSTメソッドを使用してスクリプトをオフラインでテストするには、以下の行をtestinput.txtなどの名前のテキストファイルに入力します。

受信者[email protected]&Fullname=M+Name

次に、そのファイルをスクリプトへの入力としてリダイレクトします。 UnixシステムおよびWindowsのMSDOSプロンプトでは、次のように実行できます。

Perl -w scriptname.pl <testinput.txt

スクリプトは、Webサイトのフォームによって送信されたかのように、その入力を受け取ります。スクリプトで問題を追跡するのに役立つように、Perlが出力するエラーメッセージを確認してください。

1
amarillion

Cgiスクリプトにデータを投稿するには:

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

Cgiスクリプトにデータを取得するには:

$ Perl index.cgi 'a=b;c=d'
0
Jake