ABC skryptów CGI

Wstecz Dalej

Wywoływanie skryptów z parametrami

Bardzo często wywołując skrypt chcemy przekazać mu jakieś dane wejściowe, w oparciu o które skrypt ma wykonać swoje zadanie. Można to zrobić na kilka sposobów. Najprostszym z nich jest podanie w adresie (URL-u), poprzez który odwołujemy się do skryptu, parametrów wywołania. Jest to możliwe poprzez użycie adresu o następującej postaci:

     http://www.serwer.com/katalog/nazwa.cgi?dowolny_tekst
Fragment adresu umieszczony po znaku "?" traktowany jest jako parametr (parametry) wywołania skryptu. Serwer WWW umieszcza go w przekazywanej do skryptu zmiennej środowiskowej o nazwie QUERY_STRING, którą skrypt może odczytać i w zależności od tej wartości podjąć odpowiednie działania. I tak przykładowo, gdybyśmy skrypt test-cgi omawiany w poprzednim rozdziale wywołali następująco: http://www.wsp.krakow.pl/cgi-bin/test-cgi?testujemy, to otrzymalibyśmy wynik podobny do przedstawionego powyżej, z tym, że zmienna QUERY_STRING zamiast wartości pustej zawierałaby tekst "testujemy".

Postać tekstu umieszczonego po znaku "?" jest niemal całkowicie dowolna i zależy tylko od sposobu napisania naszego skryptu. Pamiętać należy tylko o tym, iż tekst ten nie może zawierać spacji oraz znaków spoza podstawowego zestawu ASCII (np. polskich liter). W ramach tego tekstu przekazać możemy do skryptu jeden lub więcej parametrów - jeżeli parametrów jest więcej niż jeden, sposób odzielenia ich wartości od siebie (np. przecinkiem, dwukropkiem itp.) jest również całkowicie dowolny i zależy wyłącznie od sposobu napisania skryptu.

Istnieje jednak pewna standardowa metoda kodowania wartości znajdujących się po znaku "?", która upraszcza ich późniejszą analizę przez skrypt. Metoda ta określana jest jako URL-encoding (kodowanie URL). Kodowanie URL jest standardowo rozpoznawanym przez serwery WWW sposobem zapisu znaków, które nie mogą być bezpośrednio użyte w adresie strony WWW. W kodowaniu tym wszystkie "niedozwolone" znaki (takie jak np. wspomniane spacje czy polskie litery) zastępowane są kombinacjami znaku "%" i dwucyfrowej, szesnastkowej wartości kodu ASCII danego znaku. Brzmi to może trochę skomplikowanie, dlatego najlepiej wyjaśnić to na przykładzie. Np. tekst "Ale pięknie" zakodowany metodą URL przybierze postać: "Ale%20pi%EAknie" (20 jest szesnastkową wartością kodu spacji, natomiast EA - litery "ę" w kodowaniu ISO 8859-2). Oczywiście sam znak "%" w tej konwencji również staje się znakiem "niedozwolonym" i musi być kodowany - szesnastkową wartością jego kodu jest 25, stąd też tekst "100%" zakodowany kodem URL przybierze postać "100%25".

Dodatkowo w kodowaniu URL przyjmuje się, iż znak "+" zastępuje spację. Tekst z poprzedniego przykładu moglibyśmy zatem zapisać również tak: "Ale+pi%EAknie". Oczywiście gdy chcemy umieścić w tekście sam znak "+", musimy posłużyć się jego kodem: %2B.

Z punktu widzenia parametrów skryptu istnieje jednak różnica między kodowaniem spacji za pomocą kodu "%20", a znaku "+". Spacja reprezentowana przez znak "+" traktowana jest jako rozdzielająca parametry, podczas gdy "%20" oznacza spację występującą wewnątrz treści parametru. Zatem wywołanie skryptu w następujący sposób:

     http://www.serwer.com/katalog/skrypt.cgi?Ale%20pi%EAknie
oznaczać będzie przekazanie skryptowi jednego parametru, o treści "Ale pięknie". Jeżeli natomiast wywołanie skryptu przybierze postać

     http://www.serwer.com/katalog/skrypt.cgi?Ale+pi%EAknie
oznacza to przekazanie do skryptu dwu parametrów, pierwszego o treści "Ale", drugiego zaś "pięknie".

Parametry zakodowane w powyżej opisany sposób są automatycznie dekodowane przez serwer WWW i przekazywane do wywoływanego skryptu jako parametry wiersza poleceń. Skrypt może zatem odczytać wartości tych parametrów przy użyciu standardowych mechanizmów przewidzianych w danym języku programowania do pobierania parametrów wiersza poleceń - np. w języku Perl (por. MI 8/2000) parametry te dostępne są jako elementy tablicy @ARGV: $ARGV[0], $ARGV[1] itd. Ten sposób odczytywania parametrów jest niezależny od zmiennej QUERY_STRING, w której przekazywany jest zawsze pełny, niezdekodowany tekst znajdujący się w adresie po znaku "?". Tak więc np. jeżeli do skryptu odwołamy się w sposób następujący:

     http://www.serwer.com/katalog/skrypt.cgi?Ala%20ma+pi%EAknego+kota
wówczas skrypt zostanie wywołany z trzema parametrami wiersza poleceń. Pierwszy parametr (w języku Perl $ARGV[0]) będzie mieć wartość "Ala ma", drugi ($ARGV[1]) - "pięknego" (zwróćmy uwagę na zdekodowanie zapisów %20 i %EA), trzeci ($ARGV[2]) - "kota", zaś zmienna QUERY_STRING będzie mieć wartość "Ala%20ma+pi%EAknego+kota".

Automatyczne dekodowanie parametrów wiersza poleceń działa tylko wówczas, gdy tekst znajdujący się po prawej stronie znaku "?" nie zawiera znaków równości. Jeżeli w tekście zostanie znaleziony choć jeden niezakodowany znak równości, do skryptu nie są przekazywane żadne parametry wiersza poleceń, a ustawiana jest jedynie wartość zmiennej QUERY_STRING. Konwencję taką przyjęto z uwagi na sposób przekazywania przez przeglądarki danych wysyłanych z formularzy na stronach WWW. Ponieważ dane te zawsze zawierają znaki równości (zob. rozdział "CGI i formularze"), ze względów bezpieczeństwa przyjęto, iż obecność tego właśnie znaku wyłącza mechanizm automatycznego przekazywania parametrów do skryptu. Jeżeli więc chcemy w tekście któregoś z parametrów umieścić znak równości, podobnie jak znaki "%" i "+" musimy go zakodować. Jego kodem jest %3D, czyli zapis "2+2=4" przybierze po zakodowaniu postać "2%2B2%3D4".


Wstecz Dalej

Jarosław Rafa 2000. Tekst udostępniony na licencji Creative Commons (uznanie autorstwa - użycie niekomercyjne - bez utworów zależnych). Kliknij tutaj, aby dowiedzieć się, co to oznacza i co możesz z tym tekstem zrobić. W razie jakichkolwiek wątpliwości licencyjnych bądź w celu uzyskania zgody na rozpowszechnianie wykraczające poza warunki licencji proszę o kontakt e-mailem: raj@ap.krakow.pl.

Wersja HTML opracowana 11.10.2000, ostatnia aktualizacja adresów 19.03.2002.


Powrót do spisu treści Statystyka