2010-02-08 11 views
19

Sto tentando di inviare un get o un post tramite un argomento della riga di comando. Questo è testare lo script nella riga di comando prima di testare un browser (il server ha problemi). Ho provato a cercare online, e suppongo che probabilmente stavo usando una terminologia errata perché non ho ottenuto nulla. So che questo è possibile perché ho visto qualcuno farlo. Non ricordo come è stato fatto.Come posso inviare dati POST e GET a uno script Perl CGI tramite la riga di comando?

Grazie! :)

risposta

21

Stai utilizzando il modulo CGI standard?

Ad esempio, con il seguente programma (avviso -debug negli argomenti per 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; 

che lo alimentano parametri sulla riga di comando:

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

foo => bar 
baz => quux

È anche possibile farlo tramite il input standard:

$ ./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

Sì, è possibile farlo dalla riga di comando, ignorando il server. Questa pagina spiega tutto: Perl CGI debugging (sitewizard.com) (Soprattutto l'elemento 6 in quella pagina). Qui cito la parte più importante:

Per testare la linea script utilizzando il metodo GET , è sufficiente impostare la variabile di ambiente QUERY_STRING conseguenza. Se si utilizza Windows, si potrebbe utilizzare la seguente riga di comando in una finestra DOS prima di eseguire lo script nella stessa finestra:

set [email protected] & Fullname = M + Nome

Per testare lo script offline utilizzando il metodo POST , inserire la riga di seguito in un file di testo denominato, ad esempio, testinput.txt.

[email protected] & Fullname = M + Nome

quindi reindirizzare il file come input per lo script. Sui sistemi Unix così come in prompt di DOS di Windows', si può fare in questo modo:

perl -w scriptname.pl < testinput.txt

Lo script riceverà poi che ingresso come se è stato inviato tramite un modulo sul sito web. Controllare l'errore messaggi che, se presenti, suaiutano a rintracciare il problema nello script .

+0

Per riferimento, il metodo di input ambiente variabile/standard funziona con qualsiasi applicazione CGI , Perl o in altro modo. – fennec

+0

Questo consiglio manca un po ', per non parlare del suo esempio, la riga di comando non ha speranza di funzionare. –

-1

LWP viene fornito con script già pronti che possono essere utilizzati dalla riga di comando. Controlla gli script GET e POST nel tuo sistema.

+0

Questa è una cosa diversa. Vuole eseguire uno script CGI dalla riga di comando (nessun server) per testarlo. –

17

Per testare un programma CGI dalla riga di comando, si falsifica l'ambiente che il server crea per il programma. CGI.pm ha una modalità offline speciale, ma spesso trovo più facile non usarla a causa della configurazione extra che devo fare per tutto il resto che i miei programmi normalmente si aspettano.

seconda dell'implementazione del vostro script, questo comporta la definizione di molte variabili d'ambiente, che si può fare da uno script wrapper che finge di essere il server:

#!/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 

Se stai facendo questo per un POST richiesta, l'ambiente è un po 'diverso ed è necessario fornire i dati POST sullo standard input:

#!/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 

è possibile effettuare questo sofisticato come avete bisogno e ogni volta che si desidera testare il programma, si cambia il backup dei dati nei file query_string o post_data . Se non vuoi farlo in uno script di shell, è altrettanto facile creare uno script Perl wrapper.

-1

In Windows, è possibile utilizzare VBScript per scrivere un util riga di comando che chiama in biblioteca 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 

Edit: Questo script invia le richieste HTTP e può essere utilizzato da linea di comando. Mi sono confuso dalla domanda "Come posso inviare i dati POST e GET a uno script Perl CGI tramite la riga di comando" e pensavo che si trattasse dell'invio di dati POST e GET a uno script Perl CGI tramite la riga di comando da un OS client non specificato.

+0

Vuole eseguire uno script sulla riga di comando per testarlo. Non c'è un server. –

5

Vecchio discussione, ma che stavo cercando le stesse risposte - quindi per chi segue - questo è quello che ho scoperto

RTFM! dalla pagina man CGI (e ce ne sono altri) DEBUGGING Se si sta eseguendo lo script dalla riga di comando o nel debugger perl , è possibile passare allo script un elenco di parole chiave o parametro = valore coppie sulla riga di comando o dall'input standard (non è necessario preoccuparsi di ingannare lo script in lettura dalle variabili dell'ambiente ). È possibile passare parole chiave come questo:

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. 
0

Per dare un dato cgi Post Script:

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

Per dare uno script cgi ottenere i dati:

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

Se non si desidera per modificare lo script perl, puoi chiamarlo con almeno due variabili di ambiente impostate, come già menzionato da altri. Per simulare una richiesta GET:

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

Questo è il collegamento della console per www.myserver.org/events_html.pl?limit=20

Problemi correlati